Como posso determinar se comandos diferentes usando grep, find e xargs fazem a mesma coisa?

1

Esses três comandos fazem a mesma coisa?

  • Um comando que usa grep.

    grep "a" -r .
    
  • Um comando que usa find.

    find .  -exec grep "a" {} \;
    
  • Um comando que usa um grep em um find através de xargs.

    find . | xargs grep "a"
    
por Kim 18.08.2011 / 14:12

3 respostas

2

Eles não são iguais e cada um tem problemas.

  • O primeiro não é portátil, pois usa uma extensão do Gnu. Além disso, espera-se que as opções estejam antes do padrão, não depois dele.
  • O segundo não mostra o nome do arquivo, como já foi dito.
  • O terceiro falhará se os nomes dos arquivos tiverem espaços incorporados ou semelhante.

Eu usaria em vez disso:

find .  -type f -exec grep a /dev/null {} +

É portátil, ignora arquivos não regulares, não colide com nomes de arquivos estranhos e sempre mostrará nomes de arquivos quando o padrão for encontrado.

    
por 18.08.2011 / 18:40
0

Esta é uma pergunta de lição de casa?

Você tentou?

Eles fazem coisas ligeiramente diferentes.

Por exemplo, se você alimentar grep um único nome de arquivo, ele não exibe o nome do arquivo na saída. Isso pode ser frustrante ao usar grep com find .

    
por 18.08.2011 / 16:18
0

Você deve definir melhor "faça a mesma coisa". O primeiro executa um comando, o segundo executa um find e fork + grep do exec uma vez por arquivo encontrado e o terceiro executa um mínimo de três comandos - ou mais, se muitos arquivos forem encontrados para caber em uma linha de comando. No que diz respeito ao impacto da CPU / memória, eles mais claramente fazem não fazer a mesma coisa - a diferença entre 1, três e "um monte" de processos é significativa.

De uma perspectiva do sistema de arquivos, o sistema de arquivos é percorrido, cada arquivo é stat, e então aberto, totalmente lido e fechado. Então, todos eles fazem a mesma coisa a partir dessa perspectiva, e o sistema de arquivos não percebe uma diferença (além de talvez um percurso mais lento na segunda instância, devido à sobrecarga de bifurcação de processos bifiliados).

A saída gerada para a tela é diferente, e essa diferença pode ser determinada empiricamente, apenas executando os comandos com algumas estruturas de diretórios possíveis diferentes (uma maneira óbvia é aquela que o redgrittybrick mencionou).

Eles consomem diferentes quantidades de tempo para digitar, devido ao número de caracteres diferentes e possibilidades de erros de sintaxe.

E assim por diante. Há muitas maneiras pelas quais as coisas podem "diferir". :)

    
por 25.08.2011 / 00:09