Parece haver várias maneiras de fazer isso, incluindo loops no shell script, find e xargs. Qual destes é o melhor e qual é o mais portátil?
Parece haver várias maneiras de fazer isso, incluindo loops no shell script, find e xargs. Qual destes é o melhor e qual é o mais portátil?
Respostas:
find . -exec <command> {} \;
para o diretório atual como a raiz da árvore ou em geral:
find <directory> -exec <command> {} \;
-name "*.c"
ou, por exemplo -type d
para os diretórios ...
find ... | xargs ...
idioma, ele processa arquivos em lotes, e isso geralmente será mais rápido (menos processos iniciados).
Use a -print0
opção para localizar e a -0
opção xargs
se você tiver nomes de arquivos ou diretórios com espaços:
find {dir} -print0 | xargs -0r {command}
A -print0
opção de localizar imprime os nomes de arquivos como uma NUL
lista separada por espaços em branco e não por espaço em branco, enquanto a -0
opção para xargs
instruí-lo a interromper sua entrada em NUL
vez de espaço em branco. Como NUL
é um dos caracteres que não é permitido nos nomes de arquivos Unix, não há como confundir parte de um nome de arquivo.
A -r
opção existe para que xargs
não ocorra um erro se não houver entrada.
Se a portabilidade for um problema, eu ficaria longe de maneiras específicas de fazer isso (existem muitas pessoas usando muitas conchas diferentes, mas, em geral, o find e o xargs são realmente ferramentas básicas que ninguém ousaria mudar de maneira radical) .
O uso de argumentos básicos de find e xargs deve fornecer uma solução mais portátil.
Se agrupar argumentos for aceitável, localize | O xargs provavelmente oferecerá melhor desempenho, pois executará o comando muito menos vezes do que o find -exec. Se você deseja executar o comando todas as vezes para cada arquivo ou executar no subdiretório do arquivo, provavelmente deve usar find -exec ou -execdir.
Como regra, é preferível ficar longe de loops específicos de shell; find & xargs são suficientes para a maioria dos cenários.
Verifique se a versão do comando que você está usando ainda não possui um sinalizador para operação recursiva. :)