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.

VVelev
fuente

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.

Spuder
fuente
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.

Hauke ​​Laging
fuente
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.

mkc
fuente