同じプレフィックスを共有する各ファイルグループから、ディレクトリ内の最新のn個のファイルを除いてすべて削除します。

同じプレフィックスを共有する各ファイルグループから、ディレクトリ内の最新のn個のファイルを除いてすべて削除します。

n私の質問は、「ディレクトリ内の最新のファイルを除くすべてのファイルを削除する」を必要とする以前の質問とは少し異なります。

各ファイルグループは任意のプレフィックスを共有し、各グループには少なくとも1つのファイルを含むさまざまな「グループ」のファイルを含むディレクトリがあります。事前にプレフィックスも知らず、グループが何個あるのかもわかりません。

編集:実際に私が知っているファイル名はすべてパターンに従うことですprefix-some_digits-some_digits.tar.bz2。ここで重要なのはprefix部分であり、prefix各部分に数字やダッシュがないと仮定できます。

bashスクリプトで次のことをしたいと思います。

  1. n指定されたディレクトリを繰り返し、既存のすべての「グループ」を識別し、各ファイルグループについて、そのグループの最新ファイルを除くすべてのファイルを削除します。

  2. グループにnグループより少ない数のファイルがある場合、グループに対して何もしません。つまり、グループ内のファイルは削除されません。

上記の作業を実行する強力で安全な方法は何ですかbash?このコマンドを段階的に説明できますか?

ベストアンサー1

スクリプト:

#!/bin/bash

# Get Prefixes

PREFIXES=$(ls | grep -Po '^(.*)(?!HT\d{4})-(.*)-(.*).tar.bz2$' | awk -F'-' '{print $1}' | uniq)

if [ -z "$1" ]; then
  echo need a number of keep files.
  exit 1
else
  NUMKEEP=$1
fi

for PREFIX in ${PREFIXES}; do

  ALL_FILES=$(ls -t ${PREFIX}*)

  if [ $(echo ${ALL_FILES} | wc -w) -lt $NUMKEEP ]; then
    echo Not enough files to be kept. Quit.
    continue
  fi

  KEEP=$(ls -t ${PREFIX}* | head -n${NUMKEEP})

  for file in $ALL_FILES ; do
    if [[ "$KEEP" =~ "$file" ]]; then
      echo keeping $file
    else
      echo RM $file
    fi
  done
done

説明する:

  • プレフィックスの計算:
    • something-something-something.tar.bz2正規表現に従うすべてのファイルを見つけ、最初の部分だけを最初のダッシュに切り取り、一意にします。
    • 結果は標準化されたリストです。PREFIXES
  • すべて繰り返しますPREFIXES
  • ALL_FILES次に計算PREFIX
  • 数字がALL_FILES保持するファイルの数より少ないことを確認 - > trueの場合は、何も削除せずにここで停止できます。
  • KEEP最近のNUMKEEPファイル数の計算
  • 繰り返して、指定されたファイルがファイルリストにALL_FILESないことを確認してください。KEEPその場合は削除してください。

実行時の結果の例:

$ ./remove-old.sh 2
keeping bar-01-01.tar.bz2
keeping bar-01-02.tar.bz2
RM bar-01-03.tar.bz2
RM bar-01-04.tar.bz2
RM bar-01-05.tar.bz2
RM bar-01-06.tar.bz2
keeping foo-01-06.tar.bz2
keeping foo-01-05.tar.bz2
RM foo-01-04.tar.bz2
RM foo-01-03.tar.bz2
RM foo-01-02.tar.bz2

$ ./remove-old.sh 8
Not enough files to be kept. Quit.
Not enough files to be kept. Quit.

おすすめ記事