根据文件名删除最旧的 3 个文件

根据文件名删除最旧的 3 个文件

我想根据文件名删除最旧的 3 个文件。

以下是我的备份目录中内容的示例。将有多个不同时间的副本。

Ubuntu_Scripts.zip_2018-08-09-21

这最终会删除所有文件而不会留下最新的一个或两个文件。

lst=$(ls -t /media/andy/MAXTOR_SDB1/Ubuntu_Mate_18.04/Ubuntu_Documents_*|tail -3)
for f in $lst;do if [ -f $f ];then rm -rf $f;

完成

如果可以更容易地解决这个问题,我可以生成 date_filename 格式的文件。

答案1

考虑到你的文件名格式,简单的词汇排序就足够了。例如

printf '%s\0' Ubuntu_Scripts.zip_* | sort -z | head -zn3 | xargs -0 echo rm --

对于您的示例来说这-z不是必需的,但不会花费任何费用并且使管道对任何合法名称(包括包含换行符的名称)有效。

echo一旦您对它正在识别的适当文件感到满意,请将其删除。

--

如果zsh可用,您可以使用内置的 glob 限定符按名称升序删除前三个匹配的文件:

rm -- Ubuntu_Scripts.zip_*(.on[1,3])

答案2

#!/bin/bash
# Ubuntu_Mate 18.04 LTS
#
# Delete all but 2 newest files in selected directory
# 

ls -1t /media/andy/MAXTOR_SDB1/Ubuntu_Mate_18.04/Documents_Backups/Ubuntu_Documents_* | 
# skip (leave) the 2 newest
tail -n +3 |
# delete the 3 oldest
tail -n -3 |
while IFS= read -r file
do
  rm "$file"
done   
exit 0

相关内容