Comparação de dois comandos find


12

Recentemente, recebi essa findlinha, mas não sou capaz de explicar de onde vem a diferença dos dois abaixo:

Exemplo 1

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

./names:Madison Randy:300:Product Development

Exemplo 2

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

Madison Randy:300:Product Development

Como você pode ver, no primeiro existe o arquivo específico do qual essa string é derivada e, até agora, não sou capaz de descobrir por que isso está acontecendo.

Respostas:


17

Você está dizendo ao grep para pesquisar 2 locais. grep mostra apenas o local completo se vários locais forem pesquisados.

Por exemplo

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

Observe como se eu procurar apenas 1 arquivo, grep omite o nome do arquivo

grep -i "foo" /tmp/herp
foo

Mas se eu especificar vários locais de pesquisa, o grep diz onde encontrou cada correspondência

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

Adicionando o /dev/nullmétodo, ele está enganando o grep na impressão do caminho completo, fornecendo 2 argumentos.


1
+1, mas você esqueceu de mencionar o "óbvio": "O motivo pelo qual o arquivo adicionado é /dev/nullé ter certeza de que o que estiver em grep-ed não será encontrado no /dev/nullarquivo (vazio) , para que apenas os locais corretos sejam gerados"
Olivier Dulac

Além disso, ao pesquisar, /dev/nullvocê não perde tempo pesquisando um arquivo fictício não vazio. E, finalmente, a intenção de pesquisar /dev/nullé óbvia para aqueles familiarizados com esse idioma.
Alexis

5

man grep:

-H, --com o nome do arquivo

Imprima o nome do arquivo para cada correspondência. Esse é o padrão quando há mais de um arquivo para pesquisar.

A diferença resulta do grep ser chamado com um ou dois argumentos de arquivo nos dois casos. Em vez de adicionar /dev/nullvocê poderia chamar grepcom o argumento -H. Talvez o /dev/nullcomportamento seja mais amplamente suportado.


3
grep -Hnão é portátil - o /dev/nulltruque funciona sem o GNU grep.
21314 Chris Down

4

O primeiro exemplo é equivalente à execução do grep em dois arquivos para cada arquivo encontrado como resultado da findexpressão. Por exemplo, se findencontrar três arquivos e a.txt, em seguida, será executado comob.txtc.txtgrep

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

Ao qual grep irá mostrar o nome do arquivo para o qual a saída corresponde. Como nada corresponderá ao / dev / null, é garantido que o nome do arquivo do primeiro arquivo seja impresso se corresponder.

Visto que o segundo exemplo é equivalente a

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

Nesse caso, o nome do arquivo não será impresso para correspondências, pois há apenas um argumento.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.