Пакетная команда, которая требует перенаправления вывода

Когда я хочу обработать кучу текстовых файлов, я использую

for f in *.tex; do latex "$f" ; done;

Что мне делать, когда мне нужно перенаправить вывод в другой файл, как в случае с catdvi?

Следующее не работает:

for f in *.dvi ; do catdvi -e 1 -U $f  > "${f%.dvi}.txt"; done;

Что я делаю неправильно?

2 ответа

Решение

Вы забыли процитировать $fтаким образом, имя файла, вероятно, разбито на слова из-за пробелов в имени файла. Я также предлагаю использовать ./*.dvi как это избежать проблем, если имя файла начинается с - (что заставит большинство команд рассматривать его как набор параметров вместо имени файла)

for f in ./*.dvi; do catdvi -e 1 -U "$f" > "${f%.dvi}.txt"; done

Или, возможно, объединить две петли

for f in ./*.tex; do 
    base=${f%.tex};
    latex "$f" &&
    catdvi -e 1 -U "$base.dvi" > "$base.txt";
done

Проверьте это, уменьшив сложность команды. Попробуйте это сначала:

for f in *.dvi ; do catdvi -e 1 -U $f >> catdvi.txt; done;

Если это работает, то проблема в вашем динамическом коде создания имени файла. Возможно, это будет работать:

for f in *.dvi ; do catdvi -e 1 -U $f > "${f%.dvi.txt}"; done;

Что f% пытается сделать? Должно ли это быть $f вместо этого?

for f in *.dvi ; do catdvi -e 1 -U $f > "${$f.dvi.txt}"; done;

Другие вопросы по тегам