Estoy haciendo un find
y obtengo una lista de archivos. ¿Cómo lo canalizo a otra utilidad como cat
(para que cat muestre el contenido de todos esos archivos) y básicamente necesito grep
algo de estos archivos?Cómo pasar la lista de archivos devueltos por el comando find a cat para ver todos los archivos
Respuesta
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
-exec
en unfind
(esto va a hacer lo que están queriendo hacer - pero es específica parafind
)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
)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
acommand2
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.
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
Esta es una respuesta válida, aunque no necesariamente óptima, a la pregunta. –
... sí, pero es genial si también quieres un archivo grande con nombres de archivos. –
Me gusta este el mejor. Un bloque de bucle como este deja espacio para hacer otras cosas. – kakyo
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:
- No tiene que preocuparse por los caracteres impares en los nombres de los archivos.
- 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 {} +
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'. –
@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). –
Ah mi error, esto es usar grep para buscar dentro de cada archivo coincidente.Estaba buscando simplemente filtrar la salida de find con grep –
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
¿Estás tratando de encontrar texto en los archivos? Usted puede simplemente utilizar grep para que ...
grep searchterm *
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
.
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, incluyendobash
: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 decat
. Esto no funciona bien sifind
tiene demasiada salida (más de lo que cabe en una línea de comandos) o si la salida tiene caracteres especiales (como espacios).Puede utilizar
-exec
acciónfind
'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 decat
pasándolo múltiples nombres de archivo que pueden ser ineficaces y no tener el comportamiento que desea para algunos comandos (aunque está bien paracat
). 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+
utilizarfind
's añaden modo de ejecutar un menor número de casos decat
.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 decat
. Paracat
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.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, sifind
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 usarxargs
tiene problemas con los espacios en los nombres de los archivos, ya quexargs
solo usa espacios en blanco como un delimitador.El método más robusto, portátil y eficiente también utiliza
xargs
:find [whatever] -print0 | xargs -0 cat
La bandera
-print0
dicefind
utilizar\0
delimitadores (carácter nulo) entre los nombres de archivo, y la bandera-0
dicexargs
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).
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 ^# {} \;
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
.
Aquí es mi oportunidad para el uso general:
grep YOURSTRING `find .`
se imprimirá el nombre del archivo
Esto funciona para mí
find _CACHE_* | while read line; do
cat "$line" | grep "something"
done
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
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
É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
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.
- 1. Cómo usar el comando encontrar para encontrar todos los archivos con extensiones de la lista?
- 2. Bash: cat archivos múltiples de la lista de archivos
- 3. Unix find: lista de archivos de stdin
- 4. Ver todos los archivos modificados en TFS
- 5. Formato de los datos devueltos por el comando FTP LIST?
- 6. Unix find with GNU Make para actualizar automáticamente los archivos
- 7. Lista de todos los archivos versionados en subversión? (Eliminar archivos por nombre)
- 8. comando cp debe pasar por alto algunos archivos
- 9. Usando grep para buscar archivos proporcionados por find: qué hay de malo con find. | xargs grep '...'?
- 10. La desactivación del comando cat
- 11. mostrar el contenido de todos los archivos con sus nombres de archivo con cat
- 12. Cómo pasar el resultado de find a comando argadd de vim
- 13. Comando Bash para enumerar recursivamente archivos, pero clasificándolos por clasificación
- 14. lista de PHP todos los archivos en el directorio
- 15. ¿Cómo puedo mover todos los archivos de una carpeta a otra usando la línea de comando?
- 16. ¿Cómo puedo ver el código para los archivos nib/xib?
- 17. ¿Cómo recursivamente usar JpegTran (línea de comando) para optimizar todos los archivos en subdirectorios?
- 18. ¿Cómo cambio el nombre de todos los archivos a minúsculas?
- 19. FTP consiguen todos los archivos
- 20. Comando de Unix para buscar cadena de texto en todos los archivos
- 21. archivos de lista dired ordenados por tiempo de acceso
- 22. ¿Admite GCC los archivos de comando
- 23. makefiles - compila todos los archivos c a la vez
- 24. fichero Make: compilar todos los archivos .cpp a .o archivos
- 25. Cómo pasar una lista de archivos al comando zip de Linux
- 26. Listar todos los archivos abiertos
- 27. shell - cat - fusiona contenido de archivos en un gran archivo
- 28. comando para compilar archivos c con archivos .a
- 29. SVN eliminar archivos de la lista de los comprometidos
- 30. ¿Cómo ver todos los archivos controlados en Visual SourceSafe por un usuario?
cat' find -name' * .foo '-print' funcionó muy bien para mí ... Gracias –
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
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'). –