2

私のサーバーには、日付の後にアーカイブされたフォルダー名がたくさんあります。yyyy-mm-jjこれにより、フォルダーを簡単に並べ替えて、関連するデータを見つけることができます。

特定のデータの前に行われたすべてのアーカイブを削除したいと思います。私のフォルダーの名前付けでは、自然順順は通常の並べ替えと同じであるため、通常のbash構造に依存できます。

if [ $foldername -lt "yyyy-mm-jj" ]; then
    rm -r $foldername
fi

それを行うためのより効率的な方法はありますか?

4

1 に答える 1

5

[ $foldername -lt "yyyy-mm-jj" ]は数値演算子であるため、常に false になり-ltます。比較する文字列は数値ではないため、両方とも 0 として扱われます。文字列を比較するには、代わりに<or>演算子を使用します (これは ksh/bash/zsh の機能です)。 . 文字列演算子のみが存在することに注意してください。 <=orはありません>=

ワイルドカード展開は、一致する名前を辞書順で返します。したがって、最も古いファイルを処理するには、ファイルをループして、最近のファイルを見つけたときに中断します。

for dir in [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]; do
  if ! [[ $dir < $min_date_to_keep ]]; then break; fi
  rm -r "$dir"
done
于 2012-09-16T15:25:57.357 に答える