我需要对大约 1500 个文件名进行查找,并且想知道是否有办法同时执行同时查找命令。
现在我做类似的事情
for fil in $(cat my_file)
do
find . -name $fil >> outputfile
done
有没有办法产生多个 find 实例来加快进程。现在,一次运行一个文件大约需要 7 个小时。
鉴于您提到的 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 分钟。
find
此解决方案仅调用fgrep
一次:
find . | fgrep -f my_file > outputfile
我假设它my_file
有一个您要查找的文件列表,每个名称都在单独的行上。
find
命令查找当前目录中的所有文件(包括目录)。它的输出是文件/目录列表,每行一个fgrep
输出中搜索,但不是在命令行上指定搜索词,而是从my_file
--that 获取搜索词,这就是-f
标志的用途。outputfile
也许像
find . \( -name file1 -o -name file2 -o ... \) >outputfile
您可以根据以下名称的数量构建此类行my_file
:
find . \( $(xargs <my_file printf "-name %s -o " | sed 's/-o $//') \) >outputfile
有没有办法产生多个 find 实例来加快进程。
这不是您想要解决问题的方式,因为find
它受 I/O 和 FS 限制。
-name
使用组合在一起的多个参数-o
,以便使用一个find
命令一次查找多个文件名,或者一次查找所有文件并使用一种工具,例如grep
在文件的结果列表中搜索感兴趣的文件名。