Podría ser posible usar algo en la línea de
xargs -n1 -I[] sh -c 'cat {} | grep foo > {}.foo'
o, para deshacerse de lo inútil cat
xargs -n1 -I{} sh -c 'grep foo {} > ().foo'
Por lo general, es más fácil ponerlo en un script de shell para que pueda pasarle archivos.
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
no hará lo correcto con caracteres especiales, especialmente nuevas líneas incrustadas, en los nombres de archivo. Volcaría por xargs
completo, y (dado el script anterior) simplemente hago
sh fiddle.sh *.txt
o incluso
for f in *.txt; do grep foo "$f" >"$f.txt"; done
justo en el aviso.