【问题标题】:Large Number of file concatenation大量文件连接
【发布时间】:2011-10-19 19:42:13
【问题描述】:

我在一个以type1.txt, type2.txt. 结尾的目录文件名中有大约 3-4 百万个文件(文件为 1type1.txt, 1type2.txt,2type2.txt,2type2.txt 等)

现在我想连接所有以 type1.txt & type2.txt 结尾的文件。

目前我正在为type2.txt 做类似的cat *type1.txt > allTtype1.txt。 我想在两个最终输出文件中保留顺序,我猜cat 会这样做。 但它太慢了。

请建议一些更快的方法来做同样的事情。

谢谢, 拉维

【问题讨论】:

  • I have around 3-4 million files in a directory 亲爱的。
  • 哪个 Linux 文件系统支持单个目录中的数百万个文件? Ext2/3 在目录中只能有 32k 个条目 AFAIK..

标签: linux file concatenation cat


【解决方案1】:

cat 本身并不慢。但是每次扩展shell通配符(?和*)时,shell都会读取并搜索该目录下的所有文件名,非常慢。

此外,当您按名称打开文件时,内核会花费一些时间来查找文件,这是您无法避免的。这取决于正在使用的文件系统(问题中未指定):一些文件系统比其他文件系统更智能,具有巨大的目录。

要解决这个问题,您可能会受益于获取文件列表一次

ls > /tmp/filelist

...然后使用grep 或类似方法从该列表中选择文件:

cat `grep foo /tmp/filelist` > /out/bar

整理完这些乱七八糟的东西后,请确保以一种不再发生这种情况的方式来构建您的存储/应用程序。 :) 还请确保在将文件从现有目录中取出后rmdir (即使其中只有一个文件,出于任何目的再次使用它都不会有效)。

【讨论】:

    【解决方案2】:

    您可以使用以下命令执行此操作:

    ls | while read file; do cat $file >> allTtype${file#*type}; done
    

    但正如 snap 在上面的回答中所说,每次cat 需要打开一个文件时,它都必须进行 inode 查找,这将在一个包含大量文件的目录中花费很长时间。为了加快速度,您可以使用Sleuth Kit 中的icat 逐个索引节点:

    ls -i | while read -a file_array; do icat /dev/sda1 ${file_array[0]} >> allTtype${file_array[1]#*type}; done
    

    更好的是,您可以将生成的文件放在另一个目录中:

    ls -i | while read -a file_array; do icat /dev/sda1 ${file_array[0]} >> /newdir/allTtype${file_array[1]#*type}; done
    

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 2013-09-12
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多