我正在尝试将多个文件的内容附加到一个组合文件中。现在我正在这样做:
cat file1 >> file2 >> file3 >> combined
它工作正常,但问题是我想为目录中的每个文件动态复制此行为。我尝试了这种方法:
for f in *; do
cat "$f" >> combined
done
但它似乎并没有按预期工作。
答案1
你在那里的循环:
for f in *; do cat "$f" >> combined done
如果文件combined
事先不存在应该没问题,因此它不会包含在由 生成的列表中*
(它还假设文件名不以 开头-
)。
如果确实存在,则循环最终将运行cat combined >> combined
,它将文件的内容追加到同一个文件中,直到系统空间不足或程序被中断。除非你运行 GNU 版本的 cat,否则只会产生错误:“cat:组合:输入文件是输出文件”。
为了避免这种情况,您可以明确检查$f
不是combined
:
for f in *; do
if [ "$f" != combined ]; then
cat < "$f" >> combined
fi
done
combined
或使用排除(在 Bash 中)的 glob 模式:
shopt -s extglob
for f in !(combined); do
cat < "$f" >> combined
done
在这种情况下,您最好放弃循环并cat
立即给出所有文件名列表:
cat ./!(combined) >> combined
(!(combined)
也应该在 ksh 中工作(该语法的来源)。在 zsh 中,相应的语法是set -o extendedglob; cat ./^combined >> combined
,优于 ksh 语法,之后也受支持set -o kshglob
)。