Anexar linha a muitos arquivos

4

Eu quero adicionar algum texto a mais de 200.000 arquivos Estou tentando isso

find . -name *.txt -print | xargs -I % echo "hello world" >> %

Mas nada está acontecendo. Quando eu executo find . -name *.txt , ele funciona sozinho, assim como echo "hello world" >> myfile.txt

    
por Daveo 03.05.2012 / 05:36

3 respostas

14

O shell está expandindo a parte >> % antes que xargs o veja.

Se você precisar fazer redirecionamentos de shell, terá que tentar algo assim:

find . -name "*.txt" -exec sh -c '
    echo "hello world" >> "$0"
    ' {} \;

Como funciona:

  1. find substitui {} por cada arquivo correspondente a
  2. bash -c "some command" arg0... conjuntos $0... dentro do script "some command"

Como alternativa, você pode usar um comando como sed que não dependa de >> , por exemplo,

find . -name "*.txt" -exec sed -i -e '$a\
hello world' {} \;

Referências:

por 03.05.2012 / 05:41
0

Com o GNU Parallel você pode fazer:

find . -name *.txt -print | parallel 'echo "hello world" >> {}'

Você pode instalar o GNU Parallel simplesmente por:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

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

    
por 09.05.2012 / 20:33
0

O comando original que você tentou ...

find . -name *.txt -print | xargs -I % echo "hello world" >> %

precisa ser alterado para

find . -name "*.txt" | xargs -I {} sh -c "echo 'hello world' >> '{}' "
    
por 09.03.2016 / 18:40

Tags