我需要对大约 1500 个文件名进行查找,想知道是否有办法同时执行同时查找命令。
现在我在做类似的事情
for fil in $(cat my_file)
do
find . -name $fil >> outputfile
done
有没有办法生成多个查找实例以加快该过程。现在,一次运行一个文件大约需要 7 个小时。
最佳答案
鉴于您提到的 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
在我的系统上始终花费不到一秒钟的时间。您可能希望运行 updatedb
就在开始查找 1500 个文件名的作业之前。参见 man updatedb
.如果目录.
在你的find
的只给出整个文件系统的一小部分,因此 locate
数据库包含大量不相关的文件,使用各种prune
运行时的选项 updatedb
, 最小化 locate
的大小运行时访问的数据库 locate
;然后,运行普通的 updatedb
将其他文件名恢复为 locate
数据库。使用 locate
您可能可以将运行时间缩短到 20 分钟。
关于linux 查找多种模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13073731/