Estoy haciendo una findy luego 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 grepalgo de estos archivos?
Tubería a otro proceso (aunque esto NO logrará lo que dijo que está tratando de hacer):
command1 | command2
Esto enviará la salida del comando1 como la entrada del comando2
-execen un find(esto hará lo que desea hacer, pero es específico para find)
find . -name '*.foo' -exec cat {} \;
(Todo entre findy -execson los predicados de búsqueda que ya estaba usando. {}Sustituirá el archivo particular que encontró en el comando ( cat {}en este caso); \;es para finalizar el -execcomando).
enviar la salida de un proceso como argumentos de línea de comando a otro proceso
command2 `command1`
por ejemplo:
cat `find . -name '*.foo' -print`
(Tenga en cuenta que estos no son VOLVER comillas citas regulares (bajo la tilde ~ en mi teclado).) Esto enviará la salida command1en command2como 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.
find -name '*.foo' -printfuncionó muy bien para mí ... Graciasfindpermiten escribir:,find . -name '*.foo' -exec cat {} +donde+indica quefinddebe agrupar tantos nombres de archivos como sea conveniente en una sola invocación de comando. Esto es bastante útil (se trata de espacios, etc. en los nombres de archivo sin recurrir a-print0yxargs -0).find . -name '*.foo' | xargs catfind . -name '*.foo' | xargs cat | grep stringVersión moderna
POSIX 2008 agregó el
+marcador, lofindque significa que ahora agrupa automáticamente tantos archivos como sea razonable en una sola ejecución de comando, de manera muy similarxargs, pero con una serie de ventajas:El problema del nombre del archivo es un problema
xargssin la-0opción, y el problema de 'ejecutar incluso con cero nombres de archivo' es un problema con o sin la-0opción, pero GNUxargstiene la opción-ro--no-run-if-emptypara evitar que eso suceda. Además, esta notación reduce el número de procesos, no es probable que mida la diferencia en el rendimiento. Por lo tanto, podrías escribir sensatamente:Versión clásica
Si estás en Linux o tienes GNU
findyxargscomandos, use-print0confindy-0conxargspara manejar nombres de archivos que contienen espacios y otros caracteres extraños.Afinando los resultados de
grepSi no desea los nombres de archivo (solo el texto), agregue una opción adecuada
grep(generalmente-hpara suprimir 'encabezados'). Para garantizar absolutamente que se imprima el nombre del archivogrep(incluso si solo se encuentra un archivo, o la última invocación degrepsolo se le da 1 nombre de archivo), luego agregue/dev/nulla laxargslínea de comando, para que siempre haya al menos dos nombres de archivo.fuente
xargs grep something.findse canaliza a la entrada estándar dexargs. Elxargsprograma lee su entrada estándar, divide la entrada en el espacio en blanco (espacios en blanco, líneas nuevas, pestañas, etc.) y agrega varias palabras al comandogrep somethingy ejecuta la línea de comando.xargsluego continúa leyendo la entrada y ejecutando comandos hasta que se agota la entrada.xargsejecuta elgrepcomando con la frecuencia necesaria para la entrada que se le da (finden este ejemplo)./dev/nullperder los mensajes de error.Hay algunas maneras de pasar la lista de archivos devueltos por el
findcomando alcatcomando, aunque técnicamente no todos usan tuberías, y ninguna de ellas se canaliza directamentecat.Lo más simple es usar backticks (
`):Esto toma el resultado
findy lo coloca efectivamente en la línea de comando decat. Esto no funciona bien sifindtiene demasiada salida (más de la que cabe en una línea de comandos) o si la salida tiene caracteres especiales (como espacios).En algunos shells, incluidos
bash, uno puede usar en$()lugar de backticks:Esto es menos portátil, pero es anidable. Aparte de eso, tiene casi las mismas advertencias que los backticks.
Debido a que ejecutar otros comandos en lo que se encontró es un uso común
find, find tiene una-execacción que ejecuta un comando para cada archivo que encuentra:El
{}es un marcador de posición para el nombre de archivo y\;marca el final del comando (es posible tener otras acciones después-exec).Esto se ejecutará
catuna vez para cada archivo en lugar de ejecutar una sola instancia decatpasarle varios nombres de archivo que pueden ser ineficientes y pueden no tener el comportamiento que desea para algunos comandos (aunque está biencat). La sintaxis también es incómoda de escribir: debe escapar del punto y coma porque el punto y coma es especial para el shell.Algunas versiones de
find(sobre todo la versión de GNU) permiten sustituir;con+usar-exec's añaden modo de correr menos casos decat:Esto pasará múltiples nombres de archivo a cada invocación de
cat, lo que puede ser más eficiente.Sin embargo, tenga en cuenta que esto no garantiza el uso de una sola invocación. Si la línea de comando fuera demasiado larga, los argumentos se distribuirían entre múltiples invocaciones de
cat. Paracatesto probablemente no es una gran cosa, pero para algunos otros comandos que esto puede cambiar el comportamiento de manera indeseable. En los sistemas Linux, el límite de longitud de la línea de comandos es bastante grande, por lo que la división en invocaciones múltiples es bastante rara en comparación con otros sistemas operativos.El enfoque clásico / portátil es usar
xargs:xargsejecuta el comando especificado (caten este caso) y agrega argumentos basados en lo que lee de stdin. Al igual que-execcon+, esto dividirá la línea de comandos si es necesario. Es decir, sifindproduce demasiada salida, se ejecutarácatvarias veces. Como se mencionó en la sección-execanterior, hay algunos comandos donde esta división puede resultar en un comportamiento diferente. Tenga en cuenta que el usoxargscomo este tiene problemas con los espacios en los nombres de archivo, comoxargssolo utiliza espacios en blanco como delimitador.El método más robusto, portátil y eficiente también utiliza
xargs:La
-print0bandera le dicefindque use\0delimitadores (caracteres nulos) entre los nombres de archivo, y la-0bandera le dicexargsque espere estos\0delimitadores. Esto tiene un comportamiento bastante idéntico al-exec...+enfoque, aunque es más portátil (pero desafortunadamente más detallado).fuente
ls.$()También funciona con comandos distintos defind.Para lograr esto (usando bash) haría lo siguiente:
Esto se conoce como la "sustitución de comandos" y elimina el avance de línea por defecto, ¡lo cual es realmente conveniente!
más información aquí
fuente
A mí me parece un trabajo para un script de shell:
o algo así
fuente
Esta es mi manera de encontrar nombres de archivos que contengan algún contenido que me interese, solo una línea bash que también maneja bien los espacios en los nombres de archivos:
fuente
Yo uso algo como esto:
"
-print0" argumento para "buscar" y "-0" argumento para "xargs" son necesarios para manejar los espacios en blanco en las rutas / nombres de archivo correctamente.fuente
El comando find tiene un argumento -exec que puede usar para cosas como esta, simplemente puede hacer grep directamente con eso.
Por ejemplo (a partir de aquí, otros buenos ejemplos en esta página ):
fuente
Aquí está mi tiro para uso general:
Imprimirá el nombre del archivo
fuente
En bash, lo siguiente sería apropiado:
Esto encontrará todos los archivos en el
/dirdirectorio y canalizará los nombres de los archivos dexargsforma segura, lo que conducirá de manera seguragrep.Omitir
xargsno es una buena idea si tiene muchos miles de archivos/dir;catse romperá debido a la longitud excesiva de la lista de argumentos.xargslo resolverá todo por ti.El
-print0argumento defindmallas con el-0argumentoxargsde manejar los nombres de archivo con espacios correctamente. El-iargumento para lexargspermite insertar el nombre del archivo donde sea necesario en lacatlínea de comando. Los corchetes se reemplazan por el nombre del archivo canalizado en elcatcomando desdefind.fuente
Esto funciona para mi
fuente
Usa ggrep .
para buscar un archivo en Unix que contenga texto ubicado en el directorio actual o un subdirectorio
fuente
Esto imprimirá el nombre y el contenido de los archivos solo de forma recursiva.
Editar (versión mejorada): Esto imprimirá el nombre y el contenido de los archivos de texto (ascii) solo de forma recursiva.
Un intento mas
fuente
¿Estás tratando de encontrar texto en archivos? Simplemente puede usar grep para eso ...
fuente
Para enumerar y ver el contenido de todos los archivos abc.def en un servidor en los directorios / ghi y / jkl
Para enumerar los archivos abc.def que tienen entradas comentadas y mostrar, vea esas entradas en los directorios / ghi y / jkl
fuente