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.