各ファイル名グループのファイル数が>Nの場合、XMLファイルを削除する

各ファイル名グループのファイル数が>Nの場合、XMLファイルを削除する

ディレクトリ内のXMLバックアップファイルであるファイルの末尾に追加された日付に基づいてファイルを削除したいと思います。ファイルは次の基準に従って削除する必要があります。

各セットに12個以上のファイル(各特定のバックアップファイルセットの名前)が含まれている場合、古いファイルは削除され、最新のファイルは同じディレクトリに保存する必要があります。

はい

セット1:
Wf_ABCDEF_HGD_AFFGF_DFDF_201601011224.XML

メモ:上記のグループ1のファイルは削除しないでください。

セット2:
Wf_ABHGD_AFFGF_DFDF_201101211221.XML   
Wf_ABHGD_AFFGF_DFDF_201202211222.XML   
Wf_ABHGD_AFFGF_DFDF_201304411223.XML   
Wf_ABHGD_AFFGF_DFDF_201406611224.XML   
Wf_ABHGD_AFFGF_DFDF_201508811225.XML   
Wf_ABHGD_AFFGF_DFDF_201609911226.XML   
Wf_ABHGD_AFFGF_DFDF_201707711227.XML   
Wf_ABHGD_AFFGF_DFDF_201801081228.XML   
Wf_ABHGD_AFFGF_DFDF_201901911229.XML   
Wf_ABHGD_AFFGF_DFDF_202001811210.XML   
Wf_ABHGD_AFFGF_DFDF_202101511211.XML   
Wf_ABHGD_AFFGF_DFDF_202201811212.XML   
Wf_ABHGD_AFFGF_DFDF_202301811213.XML   
Wf_ABHGD_AFFGF_DFDF_202401911214.XML   
Wf_ABHGD_AFFGF_DFDF_202501041215.XML   
Wf_ABHGD_AFFGF_DFDF_202601031216.XML

次のファイルは添付日に基づいて古いものですので削除してください。

Wf_ABHGD_AFFGF_DFDF_201101211221.XML
Wf_ABHGD_AFFGF_DFDF_201202211222.XML
Wf_ABHGD_AFFGF_DFDF_201304411223.XML
Wf_ABHGD_AFFGF_DFDF_201406611224.XML
グループ 3:-
Wf_ABCDEFGHIJKLMONM_201101211221.XML   
Wf_ABCDEFGHIJKLMONM_201202211222.XML   
Wf_ABCDEFGHIJKLMONM_201304411223.XML
Wf_ABCDEFGHIJKLMONM_201406611224.XML   
Wf_ABCDEFGHIJKLMONM_201508811225.XML   
Wf_ABCDEFGHIJKLMONM_201609911226.XML   
Wf_ABCDEFGHIJKLMONM_201707711227.XML   
Wf_ABCDEFGHIJKLMONM_201801081228.XML   
Wf_ABCDEFGHIJKLMONM_201901911229.XML   
Wf_ABCDEFGHIJKLMONM_202001811210.XML   
Wf_ABCDEFGHIJKLMONM_202101511211.XML

このグループのファイル数は12個以下なので、上記のファイルを削除しないでください。

答え1

そしてfindバッシュオフセット拡張${parameter:offset:length}、次のようにすることができます。

find -type f -execdir bash -c 'printf "%s\n" "${@:1:${#@}-12}" ' _ {} +
./Wf_ABHGD_AFFGF_DFDF_201101211221.XML
./Wf_ABHGD_AFFGF_DFDF_201202211222.XML
./Wf_ABHGD_AFFGF_DFDF_201304411223.XML
./Wf_ABHGD_AFFGF_DFDF_201406611224.XML

${#@}ファイルの総数(または平均パラメータ)を返します。

-name上記のfindコマンドオプションにパターンを指定して、持っている各ファイルセットに対して繰り返します。

または、スクリプトを介してスキーマをインポートします。

# !/bin/bash

allFILEs=(*.XML)
PATTERNs=$(printf "%s\n" "${allFILEs[@]%_*}" |sort -u)

for pattern in ${PATTERNs[@]};
do
    find -type f -name "*${pattern}*" -execdir bash -c '
        printf "%s\n" "${@:1:${#@}-12}"' _ {} + 2>/dev/null;
done

どのファイルが削除されるかをテストして確認するには(コマンドでprintf)を変更しますrmfind ...

答え2

次のコードはすべてのシナリオを実行する必要があります。

3つのシナリオはすべて1つの条件のみを満たしています。バックアップファイルの数が12を超える場合は、最も古いファイルを削除する必要があります。

cd /path/to/dir
FilePattern=(`ls --format single-column *.XML | rev | cut -d '_' -f2-  | rev | sort -u`)

for FILE in ${FilePattern[@]}
do
    File_count=`ls "$FILE"_*.XML | wc -w`
    if [ $File_count -gt 12 ]; then
        REMOVE_count=`expr $File_count - 12`
        ls --format single-column "$FILE"_*.XML | head -n $REMOVE_count |  xargs rm -f
    fi
done
  • File_countディレクトリで利用可能なファイル数を取得します。
  • if削除処理は、ファイル数が12より大きい場合にのみ開始されます。
  • REMOVE_count12より大きいファイル数の計算
  • ls --format single-columnファイルは単一の列に昇順でリストされます。
  • head最も古いファイルのインポート
  • rm削除する

関連情報