![Linux shellscript 无需 for 循环即可合并所有文件](https://linux22.com/image/1279289/Linux%20shellscript%20%E6%97%A0%E9%9C%80%20for%20%E5%BE%AA%E7%8E%AF%E5%8D%B3%E5%8F%AF%E5%90%88%E5%B9%B6%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6.png)
我在一个目录中有数百个文件,是否有一个简单的命令或命令管道可以用来将它们附加在一起?我不想使用任何循环。
答案1
cat * >/path/to/somewhere
不要做
cat * > toall.txt
因为“toall.txt”是在 cat 启动之前创建的,所以您会得到奇怪的结果,将 toall.txt “cat” 成 toall.txt。
如果要在当前目录中进行 cat,你应该使用
cat [some_globbing] > file #or
cat * > .dotted_file
.dotted_file 不会通过*
通配符进行扩展。
或者例如
(ls *.txt | xargs cat ) > /some/file
答案2
如果没有也许多文件:
cat * > /some/new/file
否则:
find . -exec cat {} + > /some/new/file
find . -exec cat {} \; > /some/new/file
答案3
与Ignatiou的建议类似:
rm /the/output && find . -print0 | xargs -0 cat >> /the/output
如果不使用 xargs,您很容易超出最大命令行长度。如果不使用 -print0,您可能会遇到文件名称中包含奇怪字符(如空格)的问题。但这也是 GNU 特有的。
答案4
这会将所有文件附加到 outfile:
for file in !(outfile); do
cat "$file" >> outfile
done
如果存在,您需要先删除 outfile。但是,这不会捕获点文件。如果您还想捕获这些文件,可以使用以下两种模式
.??* !(outfile)
创建文件列表。它要求点文件的长度至少为 3,因此排除 . 和 ..!