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
find
em mãos.
E um ponto não relacionado, ignore o xargs
:
find ... -exec ls -lrth {} +