特定の範囲の数値が指定されたファイルを削除するために、Bashで次のスクリプトを作成しました。
# *** Declare variables ***
SRC="${1}"
START="${2}"
END="${3}"
# *** Delete frame range ***
for frame in $(seq -f "%08g" "${START}" "${END}")
do
rm -vf "${SRC}${frame}"*
done
テストではうまくいきましたが、ライブサーバーで実行すると、カタツムリの速度でファイルが削除されます。 rmがそんなに遅く走る理由はありますか?
ありがとうございます!
答え1
角度:
rm -vf "${SRC}${frame}"*
シェルは最初にglobを展開してに渡される引数のリストを設定する必要がありますrm
。これを行うには、ディレクトリの内容を読み、各ファイル名をパターンと一致させます。
たとえば、$SRC
isfoo/bar
とis 00000000の場合、ディレクトリの内容全体を$frame
読み、すべての項目をパターンと一致させる必要があります。ファイルが多いと時間がかかることがあります。foo
bar00000000*
rm
すると、ディレクトリ内でこれらのファイルを見つける必要があります。ディレクトリが大きく、インデックス付けされていない場合は時間がかかることがあります。その後、ファイルを削除することは、ディレクトリを変更し、そのインデックス(存在する場合)を更新することを意味し、大きなディレクトリの場合は高価です。
シェルがフレームごとにディレクトリ全体を読み取らないようにするには、少なくとも1つのglobだけを拡張する必要があります。
10進整数の範囲をzsh
持つグローバル演算子は何ですか?<first-last>
#! /bin/zsh -
src=$1 start=$2 end=$3
[[ $# -eq 3 && $start = <-> && $end = <-> && $end -ge $start ]] || {
print -ru2 "Usage: $ZSH_SCRIPT:t <src> <start> <end>"
exit 1
}
set -o extendedglob
range="(<$start-$end>~^?(#c8))" # range expressed on 8 characters
rm -vf -- $src$~range*
コマンドに渡すことができる引数の数にシステム制限がある場合は、最後の行を次のように変更できます。
print -rN -- $src$~range* | xargs -r0 rm -vf --