我需要查找大约1500个文件名,并想知道是否有一种方法可以同时执行同时查找命令。
现在我做一些类似的事情
for fil in $(cat my_file) do find . -name $fil >> outputfile done
有没有一种方法来产生多个发现的实例,以加快进程。 现在一次运行这个循环一个文件大约需要7个小时。
这个解决方案只调用一次find
和fgrep
:
find . | fgrep -f my_file > outputfile
我假定my_file
有一个你正在寻找的文件列表,每个名字在一个单独的行上。
find
命令查找当前目录中的所有文件(包括目录)。 它的输出是一个文件/目录列表,每行一个 fgrep
命令从find命令的输出中搜索,而不是在命令行上指定搜索项,它从my_file
获取搜索项 – 这就是-f
标志。 有没有一种方法来产生多个发现的实例,以加快进程。
这不是你想要解决的问题,因为find
是I / O和FS限制的。
使用与-o
分组在一起的多个名称参数,以便使用一个find
命令一次find
多个文件名,或者查找所有文件一次,并使用诸如grep
的工具搜索感兴趣文件名的结果列表文件。
也许类似
find . \( -name file1 -o -name file2 -o ... \) >outputfile
你可以创建这种类型的行,具体取决于my_file
的名称数量:
find . \( $(xargs <my_file printf "-name %s -o " | sed 's/-o $//') \) >outputfile
考虑到您提到的7小时运行时间,我认为文件系统中有数百万个文件,因此在下一个查询开始之前,加载到一个查询中的操作系统磁盘缓冲区将被重新使用。 您可以通过对相同的find
进行几次计时来测试此假设,如下例所示。
tini ~ > time find . -name IMG_0772.JPG -ls 25430459 9504 lrwxrwxrwx 1 omg omg 9732338 Aug 1 01:33 ./pix/rainbow/IMG_0772.JPG 20341373 5024 -rwxr-xr-x 1 omg omg 5144339 Apr 22 2009 ./pc/2009-04/IMG_0772.JPG 22678808 2848 -rwxr-xr-x 1 omg omg 2916237 Jul 21 21:03 ./pc/2012-07/IMG_0772.JPG real 0m15.823s user 0m0.908s sys 0m1.608s tini ~ > time find . -name IMG_0772.JPG -ls 25430459 9504 lrwxrwxrwx 1 omg omg 9732338 Aug 1 01:33 ./pix/rainbow/IMG_0772.JPG 20341373 5024 -rwxr-xr-x 1 omg omg 5144339 Apr 22 2009 ./pc/2009-04/IMG_0772.JPG 22678808 2848 -rwxr-xr-x 1 omg omg 2916237 Jul 21 21:03 ./pc/2012-07/IMG_0772.JPG real 0m0.715s user 0m0.340s sys 0m0.368s
在这个例子中,第二次find
运行得更快,因为操作系统在第一次find
仍然在RAM中有缓冲区。 [在我的小型Linux 3.2.0-32系统上,目前top
2.5GB的RAM是缓冲区,0.3GB是免费的,使用3.8GB(即程序和操作系统约1.3GB)。]
无论如何,要加快处理速度,你需要找到一种方法来更好地利用操作系统磁盘缓冲。 例如,将系统内存翻倍或翻两番。 作为替代方法,请尝试使用locate
命令。 查询
time locate IMG_0772.JPG
在我的系统上一直采取一秒钟。 您可能希望在开始查找1500个文件名的作业之前运行updatedb
。 看到man updatedb
。 如果目录.
在find
只提供整个文件系统的一小部分,这样locate
数据库包含许多不相关的文件,在运行updatedb
时使用各种prune
选项,以最小化运行locate
时访问的locate
数据库的大小; 然后运行一个普通的updatedb
来将其他文件名恢复到locate
数据库。 使用locate
你可能会把运行时间缩短到20分钟。