【发布时间】:2014-01-18 19:48:18
【问题描述】:
我有大约 3 万个文件。我想将它们合并为一个。我使用了 CAT,但出现此错误。
cat *.n3 > merged.n3
-bash: /usr/bin/xargs: Argument list too long
如何增加使用“cat”命令的限制?如果有任何迭代方法可以合并大量文件,请帮助我。
【问题讨论】:
我有大约 3 万个文件。我想将它们合并为一个。我使用了 CAT,但出现此错误。
cat *.n3 > merged.n3
-bash: /usr/bin/xargs: Argument list too long
如何增加使用“cat”命令的限制?如果有任何迭代方法可以合并大量文件,请帮助我。
【问题讨论】:
这是一种安全的方法,无需find:
printf '%s\0' *.n3 | xargs -0 cat > merged.txt
(我还选择了merged.txt 作为输出文件,正如@MichaelDautermann 建议的那样;之后重命名为merged.n3)。
注意:这样做的原因是:
printf 是一个 bash shell builtin,其命令行不受传递给 external 可执行文件的命令行长度限制。xargs 巧妙地将输入参数(通过 pipe 传递,因此也不受命令行长度限制)分成多个调用,以避免长度限制;换句话说:xargs 在不超出限制的情况下尽可能少地拨打电话。\0 作为分隔符与 xargs 的 -0 选项配对可确保所有文件名 - 即使是那些带有嵌入空格甚至换行符的文件名 - 都按原样传递。【讨论】:
printf”而不是“find”?如果我们仍然使用“*.n3”作为“printf”的参数,那么O.P.不会还有“Argument list too long”的问题吗?
printf 的简洁性和可读性方法(只匹配当前目录而不递归,你的find 命令会变得更长)。不,"Argument list too long" 问题仅影响 external 实用程序,而 printf(至少在此处调用)是 bash builtin。
传统方式
> merged.n3
for file in *.n3
do
cat "$file" >> merged.n3
done
【讨论】:
merged.n3 不存在 - 否则您将进入无限循环,文件不断增长。
尝试使用“find”:
find . -name \*.n3 -exec cat {} > merged.txt \;
这会在您的目录中“查找”所有扩展名为“n3”的文件,然后将每个结果传递给“cat”命令。
我将输出文件名设置为“merged.txt”,您可以在完成追加后将其重命名为“merged.n3”,因为您可能不希望添加新的“merged.n3”文件在自身内部。
【讨论】:
\; 替换为+,您将只获得cat 的少数 次调用(在不超出长度限制的情况下匹配尽可能多的匹配项),而不是一个每个匹配的文件;此外,您的命令将在当前目录的整个 子树 中查找文件。