Comparación de dos comandos de búsqueda


12

Recientemente recibí este findmensaje, pero no puedo explicar de dónde proviene la diferencia de los dos siguientes:

Ejemplo 1

[root@centos share]# find . -exec grep -i "madis" {} /dev/null \;

./names:Madison Randy:300:Product Development

Ejemplo 2

[root@centos share]# find . -exec grep -i "madis" {} \;

Madison Randy:300:Product Development

Como puede ver, en el primero está el archivo específico del que deriva esta cadena y, hasta ahora, realmente no puedo descubrir por qué sucede esto.

Respuestas:


17

Le estás diciendo a grep que busque 2 ubicaciones. grep solo muestra la ubicación completa si se buscan varias ubicaciones.

Por ejemplo

touch /tmp/herp /tmp/derp
cd /tmp
echo "foo" > herp
echo "foo" > derp

Observe cómo si busco solo 1 archivo, grep omite el nombre del archivo

grep -i "foo" /tmp/herp
foo

Pero si especifico múltiples ubicaciones de búsqueda, grep dice dónde encontró cada coincidencia

grep -i "foo" herp derp
/tmp/derp:foo
/tmp/herp:foo

Agregando el /dev/nulles engaño grep para imprimir la ruta completa, proporcionando 2 argumentos.


1
+1 pero olvidó mencionar lo "obvio": "La razón por la que el archivo agregado /dev/nulles para asegurarse de que todo lo que se agrega no se encontrará en el /dev/nullarchivo (vacío) , de modo que solo se eliminen las ubicaciones correctas"
Olivier Dulac

Pero también, al buscar /dev/nullno pierde tiempo buscando en un archivo ficticio no vacío. Y finalmente, la intención de buscar /dev/nulles obvia para aquellos familiarizados con este idioma.
alexis

5

man grep:

-H, --with-filename

Imprima el nombre del archivo para cada partido. Este es el valor predeterminado cuando hay más de un archivo para buscar.

La diferencia resulta de llamar a grep con uno o dos argumentos de archivo en los dos casos. En lugar de agregar /dev/null, puede llamar grepcon el argumento -H. Tal vez el /dev/nullcomportamiento es más ampliamente compatible.


3
grep -Hno es portátil: el /dev/nulltruco funciona sin GNU grep.
Chris Down

4

El primer ejemplo es equivalente a ejecutar grep sobre dos archivos para cada archivo encontrado como resultado de la findexpresión. Por ejemplo, si findencuentra tres archivos a.txt, b.txty c.txtluego grepse ejecutan como

grep -i "madis" a.txt /dev/null
grep -i "madis" b.txt /dev/null 
grep -i "madis" c.txt /dev/null

A lo que grepse mostrará el nombre de archivo para el que coincide la salida. Como nada coincidirá con / dev / null, se garantiza que el nombre de archivo del primer archivo se imprimirá si coincide.

Mientras que el segundo ejemplo es equivalente a

grep -i "madis" a.txt
grep -i "madis" b.txt 
grep -i "madis" c.txt 

En cuyo caso, el nombre del archivo no se imprimirá para las coincidencias ya que solo hay un argumento.

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.