我有一個包含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/比這裏作爲代碼的作品。 –