A melhor maneira de executar um comando em cada arquivo em uma árvore de diretórios

A melhor maneira de executar um comando em cada arquivo em uma árvore de diretórios

Parece haver várias maneiras de fazer isso, incluindo loops em shell script, find e xargs. Qual destes é o melhor e qual é o mais portátil?

Responder1

find . -exec <command> {} \;

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

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

Responder2

Use a -print0opção localizar e a -0opção xargsse você tiver nomes de arquivos ou diretórios com espaços:

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

A -print0opção find imprime os nomes dos arquivos como uma NULlista separada por -em vez de espaços em branco, enquanto a -0opção xargsinstrui-o a quebrar sua entrada em NULvez de espaços em branco. Como NULé um dos caracteres não permitidos em nomes de arquivos Unix, não há como ser confundido com parte de um nome de arquivo.

A -ropção existe para que xargsnão haja erro se não houver entrada.

Responder3

Se a portabilidade for um problema, eu ficaria longe de maneiras específicas de fazer isso (há muitas pessoas usando muitos shells diferentes, mas em geral find e xargs são ferramentas realmente básicas que ninguém ousaria mudar radicalmente) .

Usar argumentos básicos de find e xargs deve fornecer uma solução mais portátil.

Responder4

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

informação relacionada