Como fazer um loop for de nomes de arquivos com espaços usando find

4

Eu tenho o seguinte script - é suposto fazer o loop de nomes de arquivos usando o find, mas ele parece quebrar os nomes dos arquivos em um espaço? Preciso que os nomes dos arquivos permaneçam intactos

#!/bin/bash

for file in 'find -name "*.avi"'
do
./myscript $file
done

Alguém pode me ajudar?

Obrigado

    
por Rob 08.07.2012 / 17:29

4 respostas

5
find -name "*.avi" -print0 | xargs -0 -n 1 echo

Você não precisa echo in xargs :

find -name "*.avi" -print0 | xargs -0 -n 1 ./myscript
    
por 08.07.2012 / 17:35
13

Além disso: find -name "*.avi" -exec ./myscript '{}' \;

A resposta da Womble definitivamente funciona na maioria dos casos, mas o Xargs não é perfeito com espaços em todas as implementações. Eu nunca encontrei o modo 'exec' para quebrar. Solaris estava particularmente irritado com relação a isso.

Obviamente, a '-print' seria melhor para simplesmente gerar saída para uma lista de arquivos em um loop for. Mas se você estiver executando um comando em uma lista de arquivos, é mais eficiente apenas executar a opção '-exec'.

    
por 08.07.2012 / 17:39
3

Se você não precisa recursão:

#!/bin/bash

for file in *.avi
do
    ./myscript "$file"
done

Observe que as aspas ao redor da variável são essenciais.

Editar:

Como kojiro aponta, se você precisar de recursão e tiver o Bash 4, você pode adicionar shopt -s globstar e alterar o glob para **/*.avi .

    
por 08.07.2012 / 21:01
1

Além das soluções baseadas em xargs e find -exec, há também a opção de canalizar enquanto lê. Ele tem a vantagem de permitir que você estruture seu script de maneira mais clássica. Deixe-me aplicá-lo ao seu exemplo.

find -name "*.avi" | while read avifile; do
  ./myscript "$avifile"
done
    
por 08.07.2012 / 17:59

Tags