【问题标题】:Merge files with same name in more than 100 folders合并 100 多个文件夹中的同名文件
【发布时间】:2020-06-28 12:34:18
【问题描述】:

我有一个类似于Merge files with same name in different folders 的问题,我有大约 100 个不同的文件夹,其中有一个 .txt 文件“replaced_txt”,问题是我需要合并这些文件,但因为我想要 100 个不同的文件夹知道 tehre 是否比做更快:

cat /folder1/replaced_txt /folder2/replaced_txt /folder3/replaced_txt ...

【问题讨论】:

  • 如何更快? cat /*/replaced_txt 的输入速度确实更快,但不会运行得更快。 find -type f -name replaced_txt -exec cat {} + 将让您遍历任意嵌套的子目录并避免任何 eArgument 列表太长”错误,bqt 可能会对文件进行不可预测的排序。
  • 谢谢你的回答三胞胎,我在想跑得更快。我试过 'cat /*/replaced_txt 但它只会让我的电脑崩溃。我会尝试您提供的其他解决方案并让您知道
  • 这样一个简单的命令不会使现代计算机崩溃,但如果您在大目录中有大量文件,它在某些系统上可能会变慢。
  • 我觉得我的有点老了......但我尝试使用“find -type f -namereplaced_txt -exec cat {} +”并且效果很好!再次感谢:)
  • 即使是旧电脑也应该能够毫无问题地处理“cat */replaced_txt”。你能澄清“崩溃”吗?机器重启?您正在运行哪个 Linux?

标签: bash merge cat


【解决方案1】:

cat 命令几乎是最简单的命令,因此没有明显且可移植的方法可以更快地复制文件内容。无论如何,瓶颈可能是找到文件,而不是复制它们。如果文件确实都在根目录下的子目录中,

cat /*/replaced_txt >merged_txt

将按字母顺序扩展通配符(因此/folder10/replaced_txt 位于/folder2/replaced_txt 之前)但可能会遇到“参数列表太长”和/或如果其中一些目录很大(尤其是在带有ext3 文件系统的旧Linux 系统,它不能很好地扩展到大目录)。更通用的解决方案是find,它更擅长在任意嵌套的子目录中查找文件,并且不会遇到“Argument list too long”,因为它从不尝试将所有文​​件名组合成一个按字母顺序排列的列表;相反,它只是枚举它在遍历目录时以文件系统报告它们的顺序时找到的文件,并在参数列表填满到系统的ARG_MAX 限制将被超过时创建一个新的cat 进程。

find / -type f -name replaced_txt -xdev -exec cat {} + >merged_txt

如果您想限制遍历子目录的距离或只想访问某些目录,请查看 find 手册页以获取其他选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多