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?

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

+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"

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

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.



-1

Creo que quieres encontrar una cadena en los archivos

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.