目录文件名中有大约3-4百万个文件,以type1.txt, type2.txt.
结尾(文件为1type1.txt, 1type2.txt,2type2.txt,2type2.txt
等)
现在我要连接所有以type1.txt&结尾的文件。 type2.txt。
目前我正在为cat *type1.txt > allTtype1.txt
做type2.txt
。
我想在最终输出文件中保留顺序,我猜是cat
这样做。
但它太慢了。
请建议一些更快的方法来做同样的事情。
谢谢, 拉维
答案 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
现有目录(即使只有一个文件,再次使用它也不会有效)。