【问题标题】:How to concatenate huge number of files如何连接大量文件
【发布时间】:2013-09-12 18:10:43
【问题描述】:

我想连接我的文件。我用

cat *txt > newFile

但我有将近 500000 个文件,它抱怨说

argument list is too long.

有没有一种高效快速的方法来合并 50 万个文件?

谢谢

【问题讨论】:

    标签: unix concatenation cat


    【解决方案1】:

    如果你的目录结构很浅(没有子目录),那么你可以这样做:

    find . -type f -exec cat {} \; > newFile
    

    如果你有子目录,你可以将查找限制在顶层,或者你可以考虑将一些文件放在子目录中,这样你就不会遇到这个问题了!

    这不是特别有效,某些版本的 find 允许您这样做:

    find . -type f -exec cat {} \+ > newFile
    

    提高效率。 (注意+ 之前的反斜杠不是必需的,但我发现它与前面的例子很对称。)

    【讨论】:

    • 谢谢。我在哪里提到文件扩展名?我不想只收集某些文件(例如 *txt)。我没有子目录。
    • 您可以使用-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) 上完成的测试用例。
    • 请注意,此解决方案不会以某种可预测的顺序连接文件,更不用说与问题的外壳通配符扩展产生的顺序相同。
    【解决方案2】:

    如何循环执行:

    for a in *.txt ; do cat $a >> newFile ; done
    

    这样做的缺点是为每个文件生成一个新的cat 实例,这可能代价高昂,但如果文件相当大,则 I/O 开销应该会超过生成新进程所需的 CPU 时间。

    我建议以正确的顺序创建一个包含文件的文件,我不能 100% 确定使用这样的通配符(和问题中一样)的保证。

    【讨论】:

    • 我推荐这种方法用于大文件合并;比catfind 一起使用的速度略快。
    • 我建议在循环之后将重定向放置到 newfile,这样该过程就不必在每次迭代中搜索 newfile 的结尾。像这样:for a in *.txt ; do cat $a; done > newFile
    猜你喜欢
    • 2021-06-15
    • 2011-10-19
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多