Como eu envolvo uma linha com aspas no bash?

0

Quando executo for i in $(find -name '*.ogg'); do echo '$i'; done , não obtenho uma linha por arquivo como esperado. Em vez disso, quando um nome de arquivo tem um espaço, cada palavra sai em uma linha separada, portanto não posso executar comandos nos arquivos.

    
por hsribei 24.04.2010 / 02:07

5 respostas

6
find -name '*.ogg' -print0 | xargs -0 -L1 command
    
por 24.04.2010 / 03:12
1

Aqui está um exemplo de talvez o que você quer fazer:

 #! /bin/sh
 IFS="\n"
 for xxx in 'cat /etc/hosts'
 do
    echo $xxx
 done
 exit 0

I.E: Altere o IFS (Inter Field Seperator) para \ n em vez de espaço, tab, \ n

    
por 24.04.2010 / 03:10
0

Você deve canalizar find em um loop while :

find -name '*.ogg' | while read -r i; do echo "$i"; done

Além disso, as aspas simples que você tinha em torno de $i impediriam que a variável fosse expandida para seu valor.

Outra maneira é usar a substituição de processos:

 while read -r i; do echo "$i"; done < <(find -name '*.ogg')

que tem a vantagem de não criar um subshell a partir do loop while , então variáveis configuradas (e outras mudanças no ambiente) dentro do loop estarão disponíveis após o término do loop.

    
por 24.04.2010 / 03:53
0

Se você deseja executar o comando em paralelo e se o GNU Parallel http: // www.gnu.org/software/parallel/ estiver instalado, poderá fazer isso:

find -name '*.ogg' | parallel do_stuff {} --options otherargs

Assista ao vídeo de introdução do GNU Parallel para saber mais: link

    
por 22.08.2010 / 22:25
0

Além disso, não há necessidade de find neste caso. Você pode definir a opção globstar e usar bash globbing.

shopt -s globstar
for i in **/*.ogg; do echo '$i'; done
    
por 12.12.2013 / 21:16