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

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

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 uma localização por meio de xargs.

    find . | xargs grep "a"
    

Responder1

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

  • O primeiro não é portátil porque usa uma extensão Gnu. Além disso, espera-se que as opções estejam antes do padrão, e 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 similares.

Eu usaria em vez disso:

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

É portátil, ignora arquivos não regulares, não entra em conflito com nomes de arquivos estranhos e sempre mostra nomes de arquivos quando o padrão é encontrado.

Responder2

Esta é uma pergunta de dever de casa?

Você experimentou?

Eles fazem coisas ligeiramente diferentes.

Por exemplo, se você alimentar grepum único nome de arquivo, ele não ecoará o nome do arquivo na saída. Isso pode ser frustrante ao usar grepwith find.

Responder3

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

Do ponto de vista do sistema de arquivos, o sistema de arquivos é percorrido, cada arquivo é registrado e, em seguida, aberto, totalmente lido e fechado. Portanto, todos eles fazem a mesma coisa dessa perspectiva, e o sistema de arquivos não percebe diferença (além da travessia talvez mais lenta na segunda instância devido à sobrecarga da bifurcação de um zilhão de processos).

A saída gerada na tela é diferente, e essa diferença pode ser determinada empiricamente comprando apenas a execução dos comandos com algumas estruturas de diretório possíveis diferentes (uma maneira óbvia é aquela mencionada pelo redgrittybrick).

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

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

informação relacionada