为什么这不起作用?“ ls * .txt | xargs cat> all.txt”(将所有文件合并为一个txt文档)


20

为什么这不起作用?

ls *.txt | xargs cat > all.txt

(我想将所有文本文件的内容合并到一个'all.txt'文件中。)使用-exec查找也应该起作用,但是我真的很想了解xargs语法。

谢谢


1
虽然不要用ls这个。如果您确实无法使用,请cat *.txt >all.txt尝试printf '%s\0' *.txt | xargs -r0 cat >all然后mv all all.txt避免让文件本身引用。
三点五分

Answers:


27

ls *.txt | xargs cat >> all.txt

可能会更好一些,因为它将附加到all.txt,而不是在每个文件之后再次创建。

顺便说一句,cat *.txt >all.txt也可以。:-)


6
猫* .txt> all.txt自然更好。谢谢
2010年

1
但是,... | xargs cat >> all.txt或> all.txt总是返回带有xargs的错误:不匹配的单引号...是因为xargs将其后的所有内容作为命令吗?
2010年

1
您的文件名带有空格吗?如果是这样,则使用类似“查找/您的/路径-iname'* .txt'
Pikkarainen

1
不,我用替换了所有文件名空间。但是考虑到这一点,有些文件名可能包含单引号,例如listing_O'Connor .txt,这可能是问题所在!
2010年

是的,那就是问题所在。:)最简单,最聪明的方法是将find与-print0结合使用xargs -0-整个链将使用NULL字符作为分隔符,并使用空格和特殊字符来自动处理。
Janne Pikkarainen's


1

all.txt 是同一目录中的文件,因此cat想要从同一文件写入同一文件时会感到困惑。

另一方面:

ls *.txt | xargs cat > tmp/all.txt

这将从当前目录中的文本文件读取到子目录(不包含在*.txt)中的all.txt中。


仍然出现以下错误:xargs:不匹配的单引号;默认情况下,除非您使用-0选项,否则xargs的引号是特殊的
10年

1
您是否有一个.txt文件,其名称中带有单引号?
杰里米·史密斯

0

您可能还会遇到命令行长度限制。使用的部分原因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选项告诉它期望输入的格式相同。即使您的文件名中包含换行符,也可以使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.