Linuxfind多种模式

我需要查找大约1500个文件名,并想知​​道是否有一种方法可以同时执行同时查找命令。

现在我做一些类似的事情

for fil in $(cat my_file) do find . -name $fil >> outputfile done 

有没有一种方法来产生多个发现的实例,以加快进程。 现在一次运行这个循环一个文件大约需要7个小时。

这个解决方案只调用一次findfgrep

 find . | fgrep -f my_file > outputfile 

我假定my_file有一个你正在寻找的文件列表,每个名字在一个单独的行上。

说明

  1. find命令查找当前目录中的所有文件(包括目录)。 它的输出是一个文件/目录列表,每行一个
  2. fgrep命令从find命令的输出中搜索,而不是在命令行上指定搜索项,它从my_file获取搜索项 – 这就是-f标志。
  3. fgrep命令的输出(即您正在查找的文件列表)将被重定向到输出文件

有没有一种方法来产生多个发现的实例,以加快进程。

这不是你想要解决的问题,因为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分钟。