2

我在一个目录文件名中有大约 3-4 百万个文件,例如type1.txt, type2.txt.(文件是1type1.txt, 1type2.txt,2type2.txt,2type2.txt等)

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

目前我正在cat *type1.txt > allTtype1.txttype2.txt. 我想在两个最终输出文件中保留顺序,这是我的猜测cat。但它太慢了。

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

谢谢,拉维

4

2 回答 2

5

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

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

但正如 snap 在他的回答中所说,每次cat需要打开一个文件时,它都必须进行 inode 查找,这在有很多文件的目录中需要很长时间。为了加快速度,您可以使用Sleuth Kit中的icat通过inode 进行 cat :

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-08-04T12:55:25.550 回答
2

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

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

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

ls > /tmp/filelist

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

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

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

于 2011-08-04T10:42:55.820 回答