3

我需要对大约 1500 个文件名进行查找,并且想知道是否有办法同时执行同时查找命令。

现在我做类似的事情

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

有没有办法产生多个 find 实例来加快进程。现在,一次运行一个文件大约需要 7 个小时。

4

4 回答 4

2

鉴于您提到的 7 小时运行时间,我假设文件系统中有数百万个文件,因此在一个查询中加载的 OS 磁盘缓冲区在下一个查询开始之前被重用。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运行得更快,因为操作系统在 RAM 中仍然有第一个的缓冲区 find。[在我的小型 Linux 3.2.0-32 系统上,根据top目前 2.5GB 的 RAM 是缓冲区,0.3GB 是免费的,3.8GB 正在使用(即大约 1.3GB 用于程序和操作系统)。]

无论如何,为了加快处理速度,您需要找到一种更好地利用 OS 磁盘缓冲的方法。例如,将系统内存增加一倍或四倍。作为替代方案,请尝试该locate命令。该查询
time locate IMG_0772.JPG
在我的系统上始终花费不到一秒钟的时间。您可能希望updatedb在开始查找 1500 个文件名的作业之前运行。见man updatedb。如果.find的目录只提供了整个文件系统的一小部分,以至于locate数据库中包含大量不相关的文件,请在运行时使用各种prune选项updatedb,以最小化运行locate时访问的数据库的大小locate;然后,运行普通updatedb文件将其他文件名恢复到locate数据库。使用locate您可能可以将运行时间缩短到 20 分钟。

于 2012-10-25T18:18:46.383 回答
2

find此解决方案仅调用fgrep一次:

find . | fgrep -f my_file > outputfile

我假设它my_file有一个您要查找的文件列表,每个名称都在单独的行上。

解释

  1. find命令查找当前目录中的所有文件(包括目录)。它的输出是文件/目录列表,每行一个
  2. 命令从 find 命令的fgrep输出中搜索,但不是在命令行上指定搜索词,而是从my_file--that 获取搜索词,这就是-f标志的用途。
  3. fgrep 命令的输出,即您要查找的文件列表,被重定向到outputfile
于 2012-10-25T18:43:06.863 回答
2

也许像

find . \( -name file1 -o -name file2 -o ... \) >outputfile

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

find . \( $(xargs <my_file printf "-name %s -o " | sed 's/-o $//') \) >outputfile
于 2012-10-25T17:18:33.140 回答
1

有没有办法产生多个 find 实例来加快进程。

这不是您想要解决问题的方式,因为find它受 I/O 和 FS 限制。

-name使用组合在一起的多个参数-o,以便使用一个find命令一次查找多个文件名,或者一次查找所有文件并使用一种工具,例如grep在文件的结果列表中搜索感兴趣的文件名。

于 2012-10-25T17:16:32.420 回答