动态附加文件输出

动态附加文件输出

我正在尝试将多个文件的内容附加到一个组合文件中。现在我正在这样做:

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)。

相关内容