我有一个 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.gz
或pkg-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 完成
或类似的安排。
可靠地执行此操作是一项挑战,因为您可能需要一个常见事物列表来识别它们,并且如果该列表被损坏(并且它会被损坏),您最终会删除过多或不足的内容。