【发布时间】:2013-09-12 18:10:43
【问题描述】:
我想连接我的文件。我用
cat *txt > newFile
但我有将近 500000 个文件,它抱怨说
argument list is too long.
有没有一种高效快速的方法来合并 50 万个文件?
谢谢
【问题讨论】:
标签: unix concatenation cat
我想连接我的文件。我用
cat *txt > newFile
但我有将近 500000 个文件,它抱怨说
argument list is too long.
有没有一种高效快速的方法来合并 50 万个文件?
谢谢
【问题讨论】:
标签: unix concatenation cat
如果你的目录结构很浅(没有子目录),那么你可以这样做:
find . -type f -exec cat {} \; > newFile
如果你有子目录,你可以将查找限制在顶层,或者你可以考虑将一些文件放在子目录中,这样你就不会遇到这个问题了!
这不是特别有效,某些版本的 find 允许您这样做:
find . -type f -exec cat {} \+ > newFile
提高效率。 (注意+ 之前的反斜杠不是必需的,但我发现它与前面的例子很对称。)
【讨论】:
-name 限制搜索。例如,如果您只需要 .txt 文件,请使用 find . -name '*.txt' ...。有关详细信息,请参阅find 的文档。
for i in ls;do cat $i >> newFile 上的10 files 每个10GB 进行比较,为后一种方法提供50 seconds 利润;在单节点服务器 (2.1 GHz, single processor; Intel Xeon, 4 cores) 上完成的测试用例。
如何循环执行:
for a in *.txt ; do cat $a >> newFile ; done
这样做的缺点是为每个文件生成一个新的cat 实例,这可能代价高昂,但如果文件相当大,则 I/O 开销应该会超过生成新进程所需的 CPU 时间。
我建议以正确的顺序创建一个包含文件的文件,我不能 100% 确定使用这样的通配符(和问题中一样)的保证。
【讨论】:
cat 与find 一起使用的速度略快。
for a in *.txt ; do cat $a; done > newFile