编写应该使用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 ???
您可以使用xargs
来使find命令并行化。在顶层目录中运行此命令,它将把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.
OP问题的瓶颈是磁盘访问。给定200TB的数据大小,只有一小部分磁盘信息将位于缓存的内存中。结果,该操作将是磁盘绑定的。并行运行的影响相对较小-进程大多数时候将等待磁盘IO。
遵循其他用户的建议-使用定位或类似方法可能会提供更有效的搜索。即使是简单的“自己动手做”索引-将执行“查找...”并将输出存储在文件中的cron作业,也可以与grep结合使用,以按名称快速查找文件,并产生100倍的提速。
要在路径中的每个子目录中运行一个find
实例,可以使用:
for d in "$Dir"/*/
do
find "$d" -name "$FileV" &
done
wait
您可能还考虑安装并启用标准文件索引和搜索功能locate
。它会定期对所有文件建立索引,然后让您搜索索引比重新重新搜索所有文件快得多。