linux 查找多种模式

标签 linux bash

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

现在我在做类似的事情

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

有没有办法生成多个查找实例以加快该过程。现在,一次运行一个文件大约需要 7 个小时。

最佳答案

鉴于您提到的 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
在我的系统上始终花费不到一秒钟的时间。您可能希望运行 updatedb就在开始查找 1500 个文件名的作业之前。参见 man updatedb .如果目录.在你的find的只给出整个文件系统的一小部分,因此 locate数据库包含大量不相关的文件,使用各种prune运行时的选项 updatedb , 最小化 locate 的大小运行时访问的数据库 locate ;然后,运行普通的 updatedb将其他文件名恢复为 locate数据库。使用 locate您可能可以将运行时间缩短到 20 分钟。

关于linux 查找多种模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13073731/

相关文章:

json - 如果键匹配,则从 bash 中的 json 中提取特定键值

linux - 安装和删除 DNSMasq 后本地服务器/Apache 无法工作 - macOS Sierra

bash - 将空命令行传递给源脚本

linux - 读取指定的文件行并根据该文件的字创建新目录

linux - 删除shell脚本中字符串的一部分

linux - 如何通过 Vagrant 启动虚拟机

linux - AH02429 : Response header name 'record Created - ' contains invalid characters, 中止请求

php - shell输出到网络

linux - 如何转义关联数组中带有连字符的键

c - Linux 删除 root 权限 - C 脚本