如何删除超过 W 周的档案,但仍保留 N 个档案?

如何删除超过 W 周的档案,但仍保留 N 个档案?

我有一个 CentOS 7 目录,其中充满了不同包的 tar.gz 档案,每个包可以创建多个档案版本。

我正在尝试找到一种方法来删除任何超过 W 周的档案,但仍保留最多 N 个档案。

因此,以下命令:

find $top_dir -type f -name "*tar.gz" -mtime +21 -exec rm -f {} \;

这并不好,因为如果有些软件包在过去三周内没有发生变化,那么如果该软件包在过去三周内没有发生变化,那么该软件包的所有版本都可能会被删除。

因此,我需要一个命令/脚本来删除所有早于 D 天的档案,但保留任何类型档案的最后 N 个版本。

编辑:

值得关注的档案来自以下方面:

ls -1 * | grep -v "name-base.tar.gz" | grep 'tar.gz' | awk -F- '{ print $1"-"$2 }' | tr -d '[.0-9]' | sort -u

例如pkgactions-4.2.0-973-g43e2a14.tar.gzpkg-elastic-4.2.0-develop-129-ge38848d.tar.gz

保留 3 个最新档案的脚本:

以下脚本将仅保留最新的三个档案,但没有规定不删除 D 天之后的软件包。

#!/bin/bash

cd /usr/share/nginx/rpm
for pkg in $( ls -1 * | grep -v "pkg-base.tar.gz" | grep 'tar.gz' | awk -F- '{ print $1"-"$2 }' | tr -d '[.0-9]' | sort -u ); do 
        ordered=$( ls -1atr ${pkg}*) ; 
        pkg_num=$( echo $ordered | tr ' ' '\n' | wc -l ) ; 
        if [[ ${pkg_num} > 3 ]]; then
                num2delete=$(( ${pkg_num}-3 )) ; 
        else
                num2delete=0
        fi
        oldest=$( echo $ordered | tr ' ' '\n' | head -$num2delete ) ; 
        rm -f $oldest
done

答案1

这不是一个完整的答案,但是既然你有

  • 查找较新的 N 个档案的脚本(输出到newerN.lst
  • 查找所有超过 N 天的档案的脚本(输出到older.lst

你可以使用以下命令轻松生成不在 N 个较新文件中的旧文件列表:

grep --invert-match --file newerN.lst older.lst

此列表就是您想要删除的内容。

答案2

您必须单独跟踪它们(可能通过部分名称),并保留最后 N 个版本或 x 天。

对于每个 commonTh,如果超过 N,则删除超过 X 天的副本 > N fi 完成

或类似的安排。

可靠地执行此操作是一项挑战,因为您可能需要一个常见事物列表来识别它们,并且如果该列表被损坏(并且它会被损坏),您最终会删除过多或不足的内容。

相关内容