我需要对大约 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在文件的结果列表中搜索感兴趣的文件名。