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 grep
um único nome de arquivo, ele não ecoará o nome do arquivo na saída. Isso pode ser frustrante ao usar grep
with 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". :)