我如何使用&号命令在许多目录中多次执行此find命令?

问题描述 投票:2回答:3

编写应该使用find命令的脚本(由于数据库和文件系统之间的某些问题,已经尝试并且不起作用,所以定位无法工作)通过名称或扩展名来定位文件,但是因为文件系统大约是〜 200TB,运行单个find命令将没有那么快和高效。我的想法是使用“&”命令在多个目录中运行查找,因为我认为这样做会更有效,尽管我错了。到目前为止,我当前的脚本是

#!/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 ???
bash filesystems
3个回答
1
投票

您可以使用xargs来使命令并行化。在顶层目录中运行此命令,它将把find命令分配给尽可能多的CPU。

以这种方式做的一个优点是,由于您没有使进程后台运行,因此您不必担心jobspec输出混乱的stdout。

-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.  

1
投票

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

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


0
投票

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

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

您可能还考虑安装并启用标准文件索引和搜索功能locate。它会定期对所有文件建立索引,然后让您搜索索引比重新重新搜索所有文件快得多。

© www.soinside.com 2019 - 2024. All rights reserved.