Linuxフォルダ内の日付と時刻に基づいて次のファイルを並べ替え、古いファイルを削除し、最新のファイルを保持する方法は?
実際の日付に関係なく、最新の日付を維持したいと思います。最新のファイルが1年を過ぎたファイルでも構いませんので、ただ保存したいと思います。
aa_zz_yuyubc_207_dc_ghgh.brr.01_30_2019 3_15_04 am.csv
aa_zz_chuucd.brr.04_30_2020 7_15_12 pm.csv
aa_zz_ddetr_354_m.brr.5_25_2021 03_28_00 am.csv
aa_zz_xyf.brr.6_05_2021 5_20_55 PM.csv
予想される結果:のみaa_zz_xyf.brr.6_05_2021 5_20_55 PM.csv
:
日付は<month>_<day>_<year> <hour>_<minute>_<second> am/pm
12時間形式です。
ありがとう
答え1
これにより、zsh
次のことができます。
zmodload zsh/datetime
echo rm -f -- *.brr.*.csv(nOe['
LC_ALL=C strftime -rs REPLY "%m_%d_%Y %I_%M_%S %p" ${${REPLY:r}##*.brr.}
'][2,-1])
(echo
よろしければ削除してください(模擬実行のため))
zsh
逆アライメントにはglob修飾子を使用しますOe
(首都 O
)、n
コードから返された値に基づいて数値的に(使用)。$REPLY
[...]
このコードはstrftime -r
(strftime
実際には逆strptime
)を使用して、ファイル名のタイムスタンプを秒単位のエポック時間に変換します。それから私たちがしなければならないのは、最後から2番目()だけを選択して渡し、[2,-1]
最新rm
のタイムスタンプを持つ項目だけを残すことです。
答え2
find コマンドで xtime 機能を使用します。
接続時間生成時間修正時間
はい
find toto/ -name "*csv" -mtime +90 -exec rm {} \;
mtime が 90 日を超える toto/ のファイルのみを削除してください。
日付が要件と一致するかどうか(ファイル名と実際の作成/変更/アクセス日)に関係なく、最後のファイルのみを保持する場合
同様のアプローチを使用してファイルを隔離してアーカイブすることができます。
ls | sort -t_ -k5 -k4 -k3 | tail -1
ここではその正反対が必要です
number=$(ls | wc -l) # word cound by line
while read ; do rm "${REPLY}" ; done < <(ls | sort -t_ -k5 -k4 -k3 | head -$(($number - 1)))
例:
/tmp/b$
while read ; do rm "${REPLY}" ; done < <(ls | sort -t_ -k5 -k4 -k3 | head -$(($number - 1)))
/tmp/b$
ls
'aa_zz_ddetr_354_m.brr.5_25_2021 03_28_00 am.csv'
/tmp/b$