Il serait peut-être possible d’utiliser quelque chose du genre
xargs -n1 -I[] sh -c 'cat {} | grep foo > {}.foo'
ou, pour se débarrasser de l'inutile cat
xargs -n1 -I{} sh -c 'grep foo {} > ().foo'
Il est généralement plus facile de l'insérer dans un script shell afin de pouvoir simplement lui transmettre des fichiers.
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
Pédantisme: ls
ne fera pas la bonne chose avec les caractères spéciaux, notamment les nouvelles lignes intégrées, dans les noms de fichiers. Je viderais le xargs
entièrement, et (étant donné le script ci-dessus) juste faire
sh fiddle.sh *.txt
ou même
for f in *.txt; do grep foo "$f" >"$f.txt"; done
juste à l'invite.