Il pourrait être possible d'utiliser quelque chose du type
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 le mettre dans un Shell Shell afin que vous puissiez simplement lui passer 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édanterie : ls
ne fera pas ce qu'il faut avec les caractères spéciaux, notamment les retours à la ligne incorporés, dans les noms de fichiers. Je laisserais tomber le xargs
entièrement, et (étant donné le script ci-dessus) il suffit de faire
sh fiddle.sh *.txt
ou même
for f in *.txt; do grep foo "$f" >"$f.txt"; done
à l'invite.