6

Я пытаюсь выполнить последовательность команд в списке файлов один за другим. Мне было интересно, если можно использовать Xargs что-то на линии

ls *.txt | xargs -n 1 -I {} cat {} | grep foo > {}.foo

куда

cat {} | grep foo > {}.foo

это команда, которую я хочу выполнить для каждого файла.

1 ответ1

7

Может быть возможно использовать что-то вроде

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

прямо по подсказке.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .