Comparação de dois comandos find

12

Recentemente, recebi este find one-liner, 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, há o arquivo específico dessa sequência e, até agora, não consigo descobrir por que isso está acontecendo.

    
por VVelev 16.02.2014 / 23:30

3 respostas

17

Você está dizendo ao grep para pesquisar 2 locais. O grep mostra apenas a localização completa se vários locais forem pesquisados.

Por exemplo

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

Observe que, se eu pesquisar apenas 1 arquivo, o grep omite o nome do arquivo

grep -i "foo" /tmp/herp
foo

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

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

Adicionando o /dev/null , ele está enganando o grep para imprimir o caminho completo, fornecendo 2 argumentos.

    
por 17.02.2014 / 00:17
5

man grep :

-H, --with-filename

Print the file name for each match. This is the default when there is more than one file to search.

A diferença resulta do grep sendo chamado com um ou dois argumentos de arquivo nos dois casos. Em vez de adicionar /dev/null , você poderia chamar grep com o argumento -H . Talvez o comportamento /dev/null seja mais amplamente suportado.

    
por 17.02.2014 / 00:05
4

O primeiro exemplo é equivalente a executar o grep em dois arquivos para cada arquivo encontrado como resultado da expressão find . Por exemplo, se find encontrar três arquivos a.txt , b.txt e c.txt , então grep será executado como

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

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

Considerando 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 as correspondências, pois há apenas um argumento.

    
por 17.02.2014 / 00:13

Tags