如何在 Linux 中根据文件夹内的日期和时间对以下文件进行排序并删除较旧的文件并保留最新的文件?
我只想保留最新的,无论实际日期如何。最新的文件是否已经存在一年并不重要,我只想保留它。
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
globOe
限定符进行反向排序 (首都 O
),基于中代码返回n
的值以数字方式(使用 )。$REPLY
[...]
该代码使用strftime -r
(strftime
实际上是相反的strptime
)将文件名中的时间戳转换为以秒为单位的纪元时间。然后,我们所要做的就是只选择倒数第二个( )[2,-1]
来传递rm
,只留下具有最新时间戳的那个。
答案2
只需使用 find 命令中的 xtime 函数
访问时间 创建时间 修改时间
例子
find toto/ -name "*csv" -mtime +90 -exec rm {} \;
仅删除 toto/ 中 mtime > 90 天的文件。
如果您确定只保留最后一个,无论日期是否符合您的需要(文件名与创建/修改/访问的实际日期)
您可以使用类似的方法来隔离文件以保留
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$