2009-05-14 11 views

Respuesta

264
  1. tuberías a otro proceso (Aunque esto no va a lograr lo que dijo que está tratando de hacer):

    command1 | command2 
    

    Esto enviará la salida de comando1 como la entrada de comando2

  2. -exec en un find (esto va a hacer lo que están queriendo hacer - pero es específica para find)

    find . -name '*.foo' -exec cat {} \; 
    

    (Todo entre find y -exec son los predicados de búsqueda que ya estaba utilizando. {} sustituirá el archivo particular que encontraste en el comando (cat {} en este caso); la \; es para terminar el comando -exec)

  3. salida de envío de un proceso como argumentos de línea de comandos para otro proceso

    command2 `command1` 
    

    por ejemplo:.

    cat `find . -name '*.foo' -print` 
    

    (Nota Estos son BACK- CITAS no citas regulares (bajo la tilde ~ en mi teclado).) Esto enviará la salida de command1 a command2 como argumentos de línea de comandos. Sin embargo, tenga en cuenta que los nombres de archivo que contienen espacios (líneas nuevas, etc.) se dividirán en argumentos separados.

+2

cat' find -name' * .foo '-print' funcionó muy bien para mí ... Gracias –

+0

Las comillas funcionan muy bien y es más general, puede usar esto para obtener una lista de archivos de un archivo también. – Hazok

+11

Tenga en cuenta que las versiones modernas de 'find' le permiten escribir:' find. -name '* .foo' -exec cat {} + ', donde' '' indica que 'find' debe agrupar tantos nombres de archivo como sea conveniente en una sola invocación de comando. Esto es bastante útil (trata con espacios, etc. en nombres de archivos sin recurrir a '-print0' y' xargs -0'). –

6

Suena como un trabajo para un script de shell para mí:

for file in 'find -name *.xml' 
do 
    grep 'hello' file 
done 

o algo por el estilo

+2

Esta es una respuesta válida, aunque no necesariamente óptima, a la pregunta. –

+1

... sí, pero es genial si también quieres un archivo grande con nombres de archivos. –

+1

Me gusta este el mejor. Un bloque de bucle como este deja espacio para hacer otras cosas. – kakyo

62
find . -print | xargs grep something 

Si estás en Linux o GNU tener la find y xargs, a continuación, utilizar -print0 con find y -0 con xargs para manejar nombres de archivos que contienen espacios y otros caracteres de bolas impares.

Si no desea los nombres de los archivos, solo el texto, agregue una opción apropiada a grep (generalmente -h para suprimir 'encabezados'). Para garantizar que el nombre del archivo esté impreso por grep (incluso si solo se encuentra un archivo, o la última invocación de grep solo tiene 1 nombre de archivo), agregue /dev/null a la línea de comando xargs, de modo que siempre habrá al menos dos nombres de archivo.


Tenga en cuenta que POSIX 2008 añadió el marcador + a find lo que significa que ahora automáticamente grupos de todos los archivos que son razonables en una única ejecución de comandos, muy parecido a xargs hace, pero con una serie de ventajas:

  1. No tiene que preocuparse por los caracteres impares en los nombres de los archivos.
  2. No tiene que preocuparse por el comando que se invoca con cero nombres de archivo.

Ambos son problemas con xargs sin la opción -0. Por lo tanto, se puede escribir con sensatez:

find . -exec grep something {} + 
+0

Para aquellos confundidos como yo, tenga en cuenta que de esta manera primero dará toda la salida de find, y luego dará la salida de 'xargs grep something'. –

+2

@EricHu: Veo que está confundido, pero no hace lo que dice que hace, al menos no en ningún sistema basado en Unix que conozca. La salida de 'find' se canaliza a la entrada estándar de' xargs'. El programa 'xargs' lee su entrada estándar, dividiendo la entrada en el espacio en blanco (espacios en blanco, saltos de línea, pestañas, etc.) y agrega un número de las palabras al comando' grep something' y ejecuta la línea de comando. 'xargs' luego continúa leyendo la entrada y ejecutando comandos hasta que se agote la entrada. 'xargs' ejecuta el comando' grep' tantas veces como sea necesario para la entrada que se le da (de 'find' en este ejemplo). –

+0

Ah mi error, esto es usar grep para buscar dentro de cada archivo coincidente.Estaba buscando simplemente filtrar la salida de find con grep –

2

El comando find tiene un argumento -exec que se puede utilizar para este tipo de cosas, sólo podía hacer lo grep directamente a través de eso.

Por ejemplo (from here, other good examples at this page):

find . -exec grep "www.athabasca" '{}' \; -print 
-1

¿Estás tratando de encontrar texto en los archivos? Usted puede simplemente utilizar grep para que ...

grep searchterm * 
30

Hay algunas formas de pasar la lista de archivos devueltos por el comando find al comando cat, aunque técnicamente no todas las tuberías de uso, y ninguno en realidad tubería directamente a cat.

  1. Lo más sencillo es utilizar acentos abiertos:

    cat `find [whatever]` 
    

    De manera equivalente, se puede utilizar $() en lugar de acentos abiertos en algunas conchas, incluyendo bash:

    cat $(find [whatever]) 
    

    Esto es menos portátil, pero es encajable.

    Ambas sintaxis toman la salida de find y la ponen en la línea de comando de cat. Esto no funciona bien si find tiene demasiada salida (más de lo que cabe en una línea de comandos) o si la salida tiene caracteres especiales (como espacios).

  2. Puede utilizar -exec acción find 's, que ejecuta un comando para cada archivo que encuentre:

    find [whatever] -exec cat {} \; 
    

    Esto ejecutará cat una vez para cada archivo en lugar de correr una sola instancia de cat pasándolo múltiples nombres de archivo que pueden ser ineficaces y no tener el comportamiento que desea para algunos comandos (aunque está bien para cat). La sintaxis también es incómoda de escribir; necesitas escapar del punto y coma porque el punto y coma es especial para el intérprete de comandos.

    Algunas versiones de find (sobre todo la versión de GNU) permiten sustituir ; con + utilizar find 's añaden modo de ejecutar un menor número de casos de cat.

    find [whatever] -exec cat {} + 
    

    Esto pasará múltiples nombres de archivo para cada invocación de cat, que puede ser más eficiente. Tenga en cuenta que es no garantizado para utilizar una única invocación, sin embargo. Si la línea de comando sería demasiado larga, los argumentos se distribuyen en múltiples invocaciones de cat. Para cat esto probablemente no es un gran problema, pero para algunos otros comandos esto puede cambiar el comportamiento de formas no deseadas. En los sistemas Linux, el límite de longitud de línea de comando es bastante grande, por lo que dividirse en múltiples invocaciones es bastante raro en comparación con otros sistemas operativos.

  3. El enfoque clásico/portátil es utilizar xargs:

    find [whatever] | xargs cat 
    

    xargs se ejecuta el comando especificado (cat, en este caso), y añade argumentos basados ​​en lo que se lee de la entrada estándar. Al igual que -exec con +, esto dividirá la línea de comandos si es necesario. Es decir, si find produce demasiada salida, ejecutará cat varias veces. Como se mencionó anteriormente en la sección acerca de -exec, hay algunos comandos donde esta división puede dar como resultado un comportamiento diferente. Tenga en cuenta que usar xargs tiene problemas con los espacios en los nombres de los archivos, ya que xargs solo usa espacios en blanco como un delimitador.

  4. El método más robusto, portátil y eficiente también utiliza xargs:

    find [whatever] -print0 | xargs -0 cat 
    

    La bandera -print0 dice find utilizar \0 delimitadores (carácter nulo) entre los nombres de archivo, y la bandera -0 dice xargs esperar que estos \0 delimitadores. Esto tiene un comportamiento prácticamente idéntico al del -exec ... +, aunque es más portátil (pero desafortunadamente más detallado).

-1

Para enumerar y ver el contenido de todos los archivos en el servidor abc.def en los directorios/ghi y/jkl

find /ghi /jkl -type f -name abc.def 2> /dev/null -exec ls {} \; -exec cat {} \; 

Para listar los archivos abc.def que han comentado las entradas y la pantalla Véase esas entradas en los directorios/ghi y/jkl

find /ghi /jkl -type f -name abc.def 2> /dev/null -exec grep -H ^# {} \; 
1

en bash, el que sería apropiado siguientes:

find /dir -type f -print0 | xargs -0i cat {} | grep whatever 

Encontrará todos los archivos en el directorio /dir y canalizará los nombres de los archivos con seguridad en xargs, lo que conducirá de manera segura a grep.

Omitir xargs no es una buena idea si tiene miles de archivos en /dir; cat se romperá debido a la longitud excesiva de la lista de argumentos. xargs lo solucionará todo.

El argumento -print0 a find engrana con el argumento -0 a xargs para manejar nombres de archivo con espacios adecuadamente. El argumento -i al xargs le permite insertar el nombre del archivo donde sea necesario en la línea de comando cat. Los corchetes se reemplazan por el nombre de archivo canalizado en el comando cat desde find.

2

Aquí es mi oportunidad para el uso general:

grep YOURSTRING `find .` 

se imprimirá el nombre del archivo

0

Esto funciona para mí

find _CACHE_* | while read line; do 
    cat "$line" | grep "something" 
done 
9

Para lograr esto (usando bash) que haría de la siguiente manera:

cat $(find . -name '*.foo') 

Esto se conoce como la "sustitución de comando" y elimina el avance de línea por defecto, lo que es realmente conveniente.

informaciones más here

0

Use ggrep.

ggrep -H -R -I "mysearchstring" * 

para buscar un archivo en UNIX texto que contiene ubicado en el directorio actual o en un subdirectorio

4

Ésta es mi manera de encontrar los nombres de archivo que contienen algo de contenido que me interesa, un solo golpe línea que maneja muy bien los espacios en los nombres de archivo también:

find . -name \*.xml | while read i; do grep '<?xml' "$i" >/dev/null; [ $? == 0 ] && echo $i; done 
1

que usar algo como esto:

find . -name <filename> -print0 | xargs -0 cat | grep <word2search4> 

"-print0" argumento para "buscar" y "-0" argumento para "xargs" son necesarios para manejar espacios en blanco en las rutas de acceso de archivos/nombres correctamente.

Cuestiones relacionadas