Cómo buscar una palabra en todo el contenido de un directorio en Linux

15

necesita buscar algo en todo el contenido

Estoy intentando:

find . | xargs grep word

Me sale el error:

xargs: cita sin terminar

¿Cómo lograr esto?

xyz
fuente

Respuestas:

15

xargsespera la entrada en un formato que ningún otro comando produce, por lo que es difícil de usar de manera efectiva. Lo que está mal aquí es que tiene un archivo cuyo nombre debe ser citado en la entrada xargs(probablemente conteniendo un ').

Si su grep admite la opción -ro -Rpara la búsqueda recursiva, úsela.

grep -r word .

De lo contrario, use el -execprimario de find. Esta es la forma habitual de lograr el mismo efecto que xargs, excepto sin restricciones en los nombres de archivo. Las versiones razonablemente recientes de le findpermiten agrupar varios archivos en una sola llamada al comando auxiliar. Pasar /dev/nulla grepgarantiza que mostrará el nombre del archivo delante de cada coincidencia, incluso si se llama en un solo archivo.

find . -type f -exec grep word /dev/null {} +

Las versiones anteriores de find(en sistemas más antiguos o OpenBSD, o utilidades reducidas como BusyBox) solo pueden llamar al comando auxiliar en un archivo a la vez.

find . -type f -exec grep word /dev/null {} \;

Algunas versiones de findy xargstienen extensiones que les permiten comunicarse correctamente, utilizando caracteres nulos para separar los nombres de archivo para que no se requiera una cita. En estos días, solo OpenBSD tiene esta característica sin tenerla -exec … {} +.

find . -type f -print0 | xargs -0 grep word /dev/null
Gilles 'SO- deja de ser malvado'
fuente
+1 especialmente para /dev/null. Es una molestia cuando el formato de salida puede variar, dependiendo de cuántos archivos coincidan ... gracias.
Peter.O
12

Supongo que te refieres a la primera opción

grep recursivo, para buscar contenido dentro de archivos

grep -R "content_to_search" /path/to/directory

Es recursivo, para buscar archivos que coincidan

ls -lR | grep "your_search"
Feida Kila
fuente
grep -rin para recursive-case_insensitive-show_line_number
Quiero poder buscar en el contenido de cada archivo.
el primero devuelve cualquier ocurrencia en cualquier archivo, especificando el archivo donde se encontró la ocurrencia
2

Si tiene las herramientas de GNU (lo que hace si la etiqueta de Linux es precisa), puede usar -print0y -0evitar los problemas habituales de las citas:

find . -type f -print0 | xargs -0 grep word
mu es demasiado corto
fuente
0

También ACK , que está diseñado para saltar directorios especiales como .svn, .gity tal. Es una herramienta diaria para desarrolladores.

Está bastante cerca de para los interruptores comunes.

Ex. :

ack -r string .

Paquete ack-grepen Debian y Me gusta de Debian.

Gilles Quenot
fuente
0

En el directorio actual puede usar grep:

 grep -irl root .
Ranjithkumar T
fuente
-1

Creo que quieres encontrar una cadena en los archivos

Tratar find . -name "*" | xargs grep -l "string"


fuente
El mensaje de error de xargs ("Presupuesto no terminado") significa que el OP tiene un archivo. que tiene una cita en su nombre. Tu línea también se torcerá en eso. Como señaló Mu, necesita una terminación diferente.
thiton