我有一个包含30个子目录的MAIN_DIR目录,每个子目录包含大约30,000个文件。我想浏览MAIN_DIR中的每个目录,并将每个匹配特定模式的第10个文件复制到另一个位置。这是我的脚本:shell脚本中的模式匹配效率
cd /path/MAIN_DIR
num=0
for dir in *; do
cd $dir
for f in `find . -name \*XYZ*`; do
if [ `expr $num % 10` -eq 0 ]; then
cp $f /new/location/new_dir/$f
fi
num=$((num+1))
done
cd ..
done
它按预期工作,但问题是它的窘况缓慢,需要约8小时,通过所有30根目录运行。我知道模式匹配和模运算都很慢,但是8小时似乎有点高。有什么我可以做的,以提高这个脚本的速度?
很多事情,但有没有使用'expr'(这需要一个子shell和是非标准的,基本上过时)开始,只是使用shell算术'$((NUM%10))。如果你正在检查'== 0'并且只使用'if!',你也可以避免使用'\ ['/'test'' ((num%10));然后'(也是shell算术),因为手册页说“如果表达式的值不为零,返回状态为0;否则返回状态为1”。这就是说我认为这个问题比代码更适合[Code Review](https://codereview.stackexchange.com/)。 –
另外[不要用'for for'读取行](http://mywiki.wooledge.org/DontReadLinesWithFor)。 –
我投票结束这个问题作为题外话,因为它似乎更适合于https://codereview.stackexchange.com/比这里作为代码的作品。 –