大量文件串联

时间:2011-08-04 09:26:49

标签: linux file concatenation cat

目录文件名中有大约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这样做。  但它太慢了。

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

谢谢,  拉维

2 个答案:

答案 0 :(得分:4)

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

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

但正如snap在他的回答中所述,每次cat需要打开文件时,都必须进行inode查找,这需要很长时间才能在包含大量文件的目录中进行。为了加快速度,您可以使用icat中的Sleuth Kit来获取inode:

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

答案 1 :(得分:1)

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

当您按名称打开文件时,内核也会花时间查找文件,这是您无法避免的。这取决于正在使用的文件系统(在问题中未指定):某些文件系统比其他文件系统更加智能。

要对此进行排序,您可以从列出一次

的文件列表中受益
ls > /tmp/filelist

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

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

在对这个混乱进行排序之后,请确保以不再发生这种情况的方式构建存储/应用程序。 :)同样确保在你的文件出来之后rmdir现有目录(即使只有一个文件,再次使用它也不会有效)。