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?
command-line
scripting
directory
find
Brian Lyttle
fonte
fonte
-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çãoxargs
se você tiver nomes de arquivos ou diretórios com espaços:A
-print0
opção de localizar imprime os nomes de arquivos como umaNUL
lista separada por espaços em branco e não por espaço em branco, enquanto a-0
opção paraxargs
instruí-lo a interromper sua entrada emNUL
vez de espaço em branco. ComoNUL
é 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 quexargs
não ocorra um erro se não houver entrada.fonte
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.
fonte
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.
fonte
Verifique se a versão do comando que você está usando ainda não possui um sinalizador para operação recursiva. :)
fonte
Funciona melhor para mim.
fonte