Пакетная команда, которая требует перенаправления вывода
Когда я хочу обработать кучу текстовых файлов, я использую
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;