ディレクトリ内の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
)を変更しますrm
。find ...
答え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_count
12より大きいファイル数の計算ls --format single-column
ファイルは単一の列に昇順でリストされます。head
最も古いファイルのインポートrm
削除する