Localizar Comando: Caminho do Arquivo vs -name Argumento

2

Atualmente, estou construindo um script para manipular alguns arquivos em um diretório. No primeiro exemplo, eu uso o comando find e passo um diretório como argumento. No segundo, em vez disso, uso o switch -name no comando find para passar o nome do arquivo desejado. Alguém pode, no entanto, explicar-me a diferença entre os dois abaixo? Como eles produzem exatamente a mesma saída:

find dump* -type f -mtime +5 | xargs ls -ltrh

find $dir -type f -name "dump*" -mtime +5 | xargs ls -ltrh

Por favor, suponha, no caso do primeiro exemplo, que ele está sendo executado no diretório que contém os arquivos. No segundo, no entanto, pode ser executado a partir de qualquer lugar. Minha principal preocupação é em torno do filepath vs -name part; então, por favor, concentre sua atenção dessa maneira, se puder.

Desculpas se isso foi perguntado antes. Tentei procurar, mas não consegui encontrar nada.

Obrigado.

    
por Hugh 02.12.2014 / 16:17

1 resposta

3

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:

  1. É mais flexível.
  2. 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 {} +
    
por 02.12.2014 / 16:29