Linux查找多个模式

4

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

现在我做的是类似于:

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

有没有办法生成多个find实例来加快进程速度。目前每次只能运行一个文件,需要7小时才能完成循环。
4个回答

3
鉴于您提到的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分钟。

当然。如果你只需要按名称查找文件,那么你应该使用 locate - Michael Piefel
定位在我们的源代码树中找不到任何文件,我认为这与我们的源代码树实际上是一种虚拟文件系统有关,直到设置了ClearCase视图才存在。 - mike
@mike,也许你可以编辑一下问题,说明一下文件系统是什么,有多少个文件,以及是否通过网络进行访问。如果查询正在运行在不同的虚拟机上,则可能会有不同的答案。 - James Waldby - jwpat7

2
也许可以像这样。
find . \( -name file1 -o -name file2 -o ... \) >outputfile

根据 my_file 中名称的数量,您可以构建此类行:

find . \( $(xargs <my_file printf "-name %s -o " | sed 's/-o $//') \) >outputfile

2
这个解决方案只调用了一次findfgrep命令:
find . | fgrep -f my_file > outputfile

我假设my_file是一个包含你要查找的文件列表的文件,每个文件名都在单独的一行上。

解释

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

哇,是的,这正是我需要的。可以请您解释一下吗? - mike

1
有没有一种方法可以生成多个“find”实例以加快进程速度?
这不是解决问题的正确方式,因为“find”受I/O和FS限制。
要么使用多个-name参数并将它们与-o分组在一起,以便使用一个find命令同时查找多个文件名,要么查找所有文件,然后使用诸如grep之类的工具搜索所得到的文件列表中感兴趣的文件名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接