Answers:
ls *.txt | xargs cat >> all.txt
可能会更好一些,因为它将附加到all.txt,而不是在每个文件之后再次创建。
顺便说一句,cat *.txt >all.txt
也可以。:-)
如果您的某些文件名包含“,”,否则xargs
由于分隔符问题,空间将失败
通常,永远不要在xargs
没有-0的情况下运行,因为它会回来并有朝一日咬你。
考虑改用GNU Parallel:
ls *.txt | parallel cat > tmp/all.txt
或者,如果您喜欢:
ls *.txt | parallel cat >> tmp/all.txt
了解有关GNU Parallel的更多信息http://www.youtube.com/watch?v=OpaiGYxkSuQ
您可能还会遇到命令行长度限制。使用的部分原因xargs
是它将输入分成安全的命令行大小的块。因此,请设想一种情况,其中目录中有成千上万个.txt文件。 ls *.txt
将失败。你需要做
ls | grep .txt$ |xargs cat > /some/other/path/all.txt
.txt$
在这种情况下,是一个匹配以.txt结尾的所有内容的正则表达式(因此,它与 *.txt
,因为如果您有一个名为的文件atxt
,则*.txt
不会匹配它,但是该正则表达式会匹配。)
使用其他路径的原因是,正如其他答案所指出的那样,all.txt与该模式匹配,*.txt
因此输入和输出之间将发生冲突。
请注意,如果您的文件'
名中包含任何文件(这可能是导致unmatched single quote
错误的原因),则需要这样做
ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt
--null选项告诉grep使用以\0
(也就是null)字符代替默认换行符的输出,而-0
`xargs选项告诉它期望输入的格式相同。即使您的文件名中包含换行符,也可以使用。
ls
这个。如果您确实无法使用,请cat *.txt >all.txt
尝试printf '%s\0' *.txt | xargs -r0 cat >all
然后mv all all.txt
避免让文件本身引用。