rm はファイルを非常にゆっくり削除します。

rm はファイルを非常にゆっくり削除します。

特定の範囲の数値が指定されたファイルを削除するために、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。これを行うには、ディレクトリの内容を読み、各ファイル名をパターンと一致させます。

たとえば、$SRCisfoo/barとis 00000000の場合、ディレクトリの内容全体を$frame読み、すべての項目をパターンと一致させる必要があります。ファイルが多いと時間がかかることがあります。foobar00000000*

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

関連情報