批量命令,用于重新检查输出重定向

当我想处理一堆tex文件时,我会使用

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

当我需要将输出重定向到另一个文件时,我该怎么办,例如catdvi?

以下不起作用:

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

我究竟做错了什么?

你忘了引用$f ,因此文件名可能因为文件名中的空格而得到了wordsplit。 我还建议使用./*.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;