2011-05-06 5 views
31

¿Cómo puedo usar el comando Grep para buscar file name según un comodín "LMN2011*" enumerando todos los archivos con esto como un comienzo?Lista de nombres de archivo basados ​​en un patrón de nombre de archivo y contenido de archivo - ¿GREP?

Quiero agregar otra verificación sobre el contenido del archivo.

Si file content tiene algo como

LMN20113456 

¿Puedo utilizar GREP para esto?

Grep -ls "LMN2011*" "LMN20113456" 

¿Cuál es la forma correcta de buscar los nombres de los archivos y sus contenidos mediante comandos de shell?

Respuesta

51

grep no se utiliza "comodines" para la búsqueda - que es el englobamiento de shell, como * .jpg. Grep usa "expresiones regulares" para la coincidencia de patrones. Mientras que en el intérprete de comandos '*' significa "cualquier cosa", en grep significa "hacer coincidir el elemento anterior con cero o más veces".

Más información y ejemplos aquí: http://www.regular-expressions.info/reference.html

Para respuesta de su pregunta - se puede encontrar archivos que coinciden con un patrón con grep:

find /somedir -type f -print | grep 'LMN2011' # that will show files whose names contain LMN2011 

Ahora tiene que buscar su contenido (mayúsculas y minúsculas):

find /somedir -type f -print | grep -i 'LMN2011' | xargs grep -i 'LMN20113456' 

Si las rutas pueden contener espacios, se debe utilizar la función de "extremo cero":

find /somedir -type f -print0 | grep -iz 'LMN2011' | xargs -0 grep -i 'LMN20113456' 
+0

¿Cómo puedo escribir los nombres de archivo de resultados en un archivo de texto en el servidor – zod

7
grep LMN20113456 LMN2011* 

o si desea buscar de forma recursiva a través de subdirectorios:

find . -type f -name 'LMN2011*' -exec grep LMN20113456 {} \; 
+0

¿Cómo puedo escribir los nombres de archivo de resultados en un archivo de texto en el servidor – zod

+0

Utilice grep -l para mostrar nombres de archivos coincidentes en lugar de líneas coincidentes y luego redirija la salida a un archivo. –

0

find/folder -type f -mtime -90 | grep -E "(.txt | .php | .inc | .root | .gif)" | xargs ls -l> WWWlastActivity.log

23

Se puede hacer sin find así mediante el uso de la opción de grep "--include".

página de manual grep dice:

--include=GLOB 
Search only files whose base name matches GLOB (using wildcard matching as described under --exclude). 

Así que para hacer una búsqueda recursiva de una cadena en un archivo que coincide con un patrón específico, que se verá algo como esto:

grep -r --include=<pattern> <string> <directory> 

Por ejemplo, para buscar de forma recursiva para la cadena "MyTarget" en todos los Makefile:

grep -r --include="Makefile" "mytarget" ./ 

O para buscar en todos los archivos de inicio ING con "Marca" en el nombre de archivo:

grep -r --include="Make*" "mytarget" ./ 
+0

sería bueno saber, "cómo se puede hacer sin encontrar", realmente, solo para compartir el punto de vista – Victor

0

Supongamos LMN2011* archivos están dentro /home/me pero omitiendo cualquier cosa en /home/me/temp o por debajo de:

find /home/me -name 'LMN2011*' -not -path "/home/me/temp/*" -print | xargs grep 'LMN20113456' 
Cuestiones relacionadas