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