Может быть возможно использовать что-то вроде
xargs -n1 -I[] sh -c 'cat {} | grep foo > {}.foo'
или, чтобы избавиться от бесполезного cat
xargs -n1 -I{} sh -c 'grep foo {} > ().foo'
Обычно проще поместить его в сценарий оболочки, так что вы можете просто передать его файлы.
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
Педантичность: ls
не будет правильно делать со специальными символами, особенно со встроенными символами новой строки, в именах файлов. Я бы полностью xargs
и (учитывая приведенный выше скрипт) просто сделал
sh fiddle.sh *.txt
или даже
for f in *.txt; do grep foo "$f" >"$f.txt"; done
прямо по подсказке.