当我想处理一堆 tex 文件时,我使用
for f in *.tex; do latex "$f" ; done;
当我需要将输出重定向到另一个文件时,例如 catdvi 的情况,我该怎么做?
以下操作无效:
for f in *.dvi ; do catdvi -e 1 -U $f > "${f%.dvi}.txt"; done;
我究竟做错了什么?
答案1
您忘记引用$f
,因此文件名可能由于文件名中的空格而被拆分。我还建议使用./*.dvi
as 以避免文件名以 开头时出现问题-
(这会使大多数命令将其视为一组选项而不是文件名)
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
答案2
通过降低命令的复杂性来测试它。首先尝试一下:
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;