ファイル名の比較とtarファイルに基づく2つの日付形式

ファイル名の比較とtarファイルに基づく2つの日付形式

4か月(前3ヶ月+現在1ヶ月)以降のファイルをディレクトリに保存し、残りはtarとして保存する必要があります。しかし、問題は、私のファイルが別の形式で構成されていることです。

StockList_03-01-2015.txt
Ref_01-02-2016.txt
Data_2015-07-20.txt
Test_2016-01-13.txt

上記の例のように、日付は次のとおりです。年月日または年月日形式を使用するには、ファイル名から日付を抽出し(前の3ヶ月+今月の1月)、範囲内にないかどうかを比較してから圧縮する必要があります。

今日は3月2日で、2015年12月1日から今日までのファイルは保持されますが、他のファイルはタール処理されます。

例で予想される tar ファイルは次のとおりです。

StockList_03-01-2015.txt
Data_2015-07-20.txt

どちらの種類の日付形式でも正規表現を作成できますが、それらを組み合わせる方法がわかりません。

yyyy-mm-ddの正規表現:

ls |grep -Eo '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}'   

dd-mm-yyyyの正規表現:

ls |grep -Eo '[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{4}'

日付比較:

files=($(ls | awk -v d=$(date -d '3 months ago' +%m-%Y.log) 'DATE_FROM_FILES< d {print;}' ))

tar cvzf archive.tar.gz "${files[@]}"

答え1

日付が拡張子の前の最後の部分で、後ろに下線が付けられ、拡張子が常に.txtである特定の一般的なファイル名形式を想定すると、次のスクリプトを使用できます。

d=$(date -d '3 months ago' +%Y-%m)
files=()
ls | while read f ; do
    df1="${${f##*_}%.txt}"
    df2=${df1//-//}
    df=$( date --date $df1 +%Y-%m 2>/dev/null || date --date $df2 +%Y-%m)
    [[ "$df" < "$d" ]] && files=( $files $f )
done
tar cvzf archive.tar.gz "${files[@]}"
# rm ${files[@]}

ここで重要な点は、比較される日付文字列の年の値が月の値の左側にある必要があり、アルファベット順が日付順に理解されることです。次に、コマンドは最初にファイル名の最後のアンダースコアまですべてを削除し、次に拡張子を削除してファイル名から取得したdate日付を返しyyyy-mm-ddますdd/mm/yyyy。として使用できます。それは代替によって獲得されます。$df1.txt$df2-/

このようにして、$df1いずれかが$df2ファイル名の日付部分を決定し、それをyyyy-mm比較形式に変更できる必要があります。これはdate日付エラーメッセージで失敗し、dd-mm-yyyyスクリプトはそれを次にパイプします。/dev/null

次に、切り捨てられた日付より前のファイル名をソートして圧縮し、圧縮されたファイルを削除(コメント)します。

関連情報