xargs com vários comandos

6

Estou tentando executar uma sequência de comandos em uma lista de arquivos, um por um. Eu queria saber se é possível usar xargs algo nas linhas de

ls *.txt | xargs -n 1 -I {} cat {} | grep foo > {}.foo

Onde

cat {} | grep foo > {}.foo

é o comando que quero executar em cada arquivo.

    
por anand.trex 23.03.2011 / 04:42

1 resposta

7

Pode ser possível usar algo nos moldes de

xargs -n1 -I[] sh -c 'cat {} | grep foo > {}.foo'

ou, para se livrar da% inútilcat

xargs -n1 -I{} sh -c 'grep foo {} > ().foo'

Geralmente, é mais fácil colocá-lo em um script de shell para que você possa simplesmente passar os arquivos.

cat > fiddle.sh <<\EOF
for f in "$@"; do
  grep foo "$f" >"$f.foo"
done
EOF
ls *.txt | xargs sh fiddle.sh    # note we can now pass multiple files, no -n1 or -I needed

Pedantry: ls não fará a coisa certa com caracteres especiais, notavelmente novas linhas incorporadas, em nomes de arquivos. Eu despejo o xargs inteiramente, e (dado o script acima) apenas faça

sh fiddle.sh *.txt

ou até mesmo

for f in *.txt; do grep foo "$f" >"$f.txt"; done

logo no prompt.

    
por 23.03.2011 / 04:50

Tags