No primeiro caso, dump* é interpretado pelo shell e expandido em nomes de arquivos correspondentes e, em seguida, passado para find . Com efeito, find vê:
find dumpa dumpb ... -type f ...
No segundo caso, nenhuma interpretação é feita pelo shell. find faz a filtragem. Portanto, considerando a natureza recursiva de find , o segundo método pode localizar arquivos que o primeiro perderá.
O segundo método é mais flexível, já que você pode usar variáveis na formação dos filtros -name / -path , mas é difícil conseguir o shell para expandir um curinga em uma variável. Dependendo de qual é o seu caso de uso, ele estará correto, mas o segundo pode ser corrigido para corresponder ao primeiro em todos os casos (usando find opções adicionais, como maxdepth ou prune ), mas o contrário não é t verdadeiro.
Considere:
$ tree .
.
├── dumpa
│ └── dumpc
├── dumpb
├── dumpd
└── not-dump
└── dumpe
$ find . -type f -name 'dump*'
./not-dump/dumpe
./dumpd
./dumpa/dumpc
$ find dump* -type f
dumpa/dumpc
dumpd
Observe também que, se nada corresponder ao curinga, o primeiro resultará em erro, mas o segundo será bem-sucedido sem resultados:
$ find blahblah* -type f
find: 'blahblah*': No such file or directory
$ find . -name 'blahblah*' -type f
$
Eu preferiria o segundo método porque:
- É mais flexível.
- Menos propenso a erros. Usar curingas onde nada corresponde pode causar problemas. Eu evito a expansão do shell de curingas se eu puder, especialmente se eu tiver uma ferramenta como
findem mãos.
E um ponto não relacionado, ignore o xargs :
find ... -exec ls -lrth {} +