パターンに一致するディレクトリのファイル数を取得し、最も古いファイルを削除します。

パターンに一致するディレクトリのファイル数を取得し、最も古いファイルを削除します。

私は次のことをしたいと思います:

  1. 指定されたパターンに一致する指定されたディレクトリのファイル数を取得します。たとえば、次のようになります。

    ExtractBackup_{date}.tar.gz

  2. 数字が2以上の場合、パターンに一致する最も古いファイルは削除されます。

Korn Shell( ) スクリプトを使用して.kshこれを行うにはどうすればよいですか?

答え1

パターンに一致するファイル数を計算する直接的な方法はありませんが、2つの簡単なステップで計算できます。ファイルリストを作成し、リストの長さを取得します。日付がYYYYMMDD形式であると仮定します(これにより位置パラメータが破損することに注意してください)。

set ExtractBackup_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].tar.gz
if [ -e "$1" ]; then count=$#; else count=0; fi

ksh93では、一致するファイルがない場合はリストを空にして計算を簡素化できます。どのファイルとも一致しないパターンは、1つの単語を含むリストに置き換えられます(つまり、パターン自体)。 ksh93 には、パターンを空のリストに拡張する構成があります。 Kshには配列があるので、位置引数を台無しにする必要はありません。

backups=(~(N:ExtractBackup_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].tar.gz))
count=${#backups[@]}

日付がYYYYMMDD形式の場合、最も古いファイルはリストの最初の項目になります。

set ExtractBackup_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].tar.gz
if [ $# -ge 2 ]; then rm "$1"; fi

答え2

いいですね。パターンをパラメータとして使用してこのスクリプトを実行します。複数のファイルが一致すると、最も古いファイルが削除されます。例:

$ ksh dtof.sh ?? # this will delete the oldest two-character file

スクリプト:

for i in "$@"; do
  if [ ! "$oldest" ]; then
    oldest="$i"
    continue
  fi
  if [ "$i" -ot "$oldest" ]; then
    oldest="$i"
    reap="$i"
  else
    reap="$oldest"
  fi
done
[ "$reap" ] && rm "$reap"

答え3

kshについて知らないので、組み合わせることができるいくつかのツールを教えてください。

現在のフォルダ内の特定のパターンに一致するすべてのファイルを見つけてカウントを返します。

find . -maxdepth 1 -type f -name '*.tgz' | wc -l

最も古いファイルを選択するには、以下の出力から最初の項目を選択してください。

ls -t1p | grep -v /

幸運:-)

関連情報