如何使用 & 符号命令在许多目录中多次执行此查找命令'&'?



编写一个脚本,该脚本应利用find命令(由于数据库和文件系统之间的某些问题,定位不起作用,已经尝试过并且不起作用(按名称或扩展名查找文件,但是由于文件系统约为~200TB,因此运行单个查找命令不会那么快速和高效。我的想法是使用"&"命令在多个目录中运行查找,因为我相信这样会更有效率,尽管我错了。 到目前为止,我目前的脚本是

#!/bin/bash
echo "Enter either file name or format:"
read FileV
echo "Input the absolute path to directory"
read Dir
for d in $Dir
do
( cd $d && find ???

您可以使用xargs来平行查找命令。 在顶级目录中运行它,它会将find命令扩展到尽可能多的 CPU。

这样做的一个优点是,由于您没有后台处理流程,因此您无需担心 jobspec 输出混乱的标准输出。

-name部分更改为您要查找的任何部分:

for dir in */; do echo "$dir"; done | xargs -P0 -I_ find _ -type f -name "*.sh" > /tmp/outfile

xargs手册页

-P max-procs, --max-procs=max-procs
Run up to max-procs processes at a time; the default is 1.  If max-procs
is 0, xargs will run as many processes as possible at a time.  

OP 问题的瓶颈是磁盘访问。给定 200TB 的数据大小,只有一小部分磁盘信息将位于缓存内存中。因此,该操作将绑定到磁盘。并行运行的影响相对较小 - 进程大部分时间都在等待磁盘 IO。

遵循其他用户的建议 - 使用 locate 或类似方法可能会提供更有效的搜索。即使是一个简单的"自己动手"索引 - cron job,它将执行"查找...",并将输出存储在文件中,也可以与grep结合使用,以按名称快速查找文件,并产生100倍的加速。

要在路径中的每个子目录运行一个find实例,可以使用:

for d in "$Dir"/*/
do
find "$d" -name "$FileV" &
done
wait

您可能还需要考虑安装和启用locate,这是标准文件索引和搜索功能。它将定期为所有文件编制索引,然后让您搜索索引的速度比再次重复所有文件快得多。

最新更新