ti-enxame.com

Melhor maneira executando um comando em cada arquivo em uma árvore de diretório

Parece haver várias maneiras de fazer isso, incluindo loops no script, encontrar e xargs. Qual destes é melhor, e que é mais portátil?

14
Brian Lyttle
find . -exec <command> {} \;

para o diretório atual como a raiz da árvore ou em geral:

find <directory> -exec <command> {} \;
13
txwikinger

Use a opção -print0 Para localizar e a opção -0 Para xargs Se você tiver nomes de arquivo ou diretório com espaços:

find {dir} -print0 | xargs -0r {command}

A opção -print0 Para encontrar impressões os nomes de arquivos como um NUL- separado em vez de lista separada por espaço em branco, enquanto a opção -0 Para xargs instrui-lo a quebrar sua entrada em NUL em vez de espaço em branco. Como NUL é um dos personagens que não é permitido em nomes de arquivos Unix, não há como ser confundido com parte de um nome de arquivo.

A opção -r Existe para que xargs não lhe dê um erro se não tiver entrada.

5
dhd

Se os argumentos do agrupamento são aceitáveis, encontre | Os Xargs provavelmente darão melhor desempenho, uma vez que executará o comando muito menos vezes do que encontrar -exec. Se você quiser executar o comando toda vez para cada arquivo ou execução no subdiretório do arquivo, provavelmente deve usar localizar -exec ou -execdir.

Por via de regra, é preferível ficar longe de loops específicos da Shell; Find & Xargs são suficientes para a maioria dos cenários.

2
Eugen Anghel

Certifique-se de que a versão do comando que você está usando não possui um sinalizador para operação recursiva. :)

1
Kevin Cantu
find [args] -print | xargs {command}

Funciona melhor para mim.

0
Josh K