1

我用 PHP 编写了以下内容,但我想知道是否有一种优雅的方法可以在 Linux shell 脚本中执行此操作?基本上删除超过 (n) 天的文件,但保留 (n) 最新的文件,无论年龄大小。

    PHP

    foreach (glob("backup/*.db") as $file) {
        $a[$file]=date("Y-m-d",filemtime($file));
    }
    $i=0;
    arsort($a);
    foreach($a as $file=>$date) {
        if ($i++>=10) {
            if ($date<=date("Y-m-d",strtotime("-10 days"))) {
                unlink($file);
                xmessage("PURGED: $file");
            }   
        }   
    }   

我的想法是用“find -mtime +(n) exec rm”删除,但只在不在“head -n +(n)”中的文件中使用管道?但是“head -n”似乎并没有像我想象的那样做。谢谢。

SHELL SCRIPT

find -mtime +10 | ls -t *.DB.tar.gz | head -n -10
4

2 回答 2

2

尝试使用所有 GNU find、sort、awk 和 xargs:

find . -type f -printf '%Ts %p\0' |
sort -k1,1nr -sz |
awk -v days=10 -v cnt=10 '
    BEGIN { RS=ORS="\0"; secs=systime()-(days*24*60*60) }
    (NR>cnt) && ($1>secs) { print gensub(/\S+\s+/,"",1) }
' |
xargs -0 ls --

更改lsrm您完成测试并确保它为您提供预期输出的时间。

于 2021-02-14T04:04:00.623 回答
0

如果你有一个find不能使用的版本-printf(f.ex. busybox),你可以使用这个:

find ${FOLDER} -type f -exec stat -c "%y %-25n" {} \; |
sort -n |
head -n -$(MIN_FILES_TO_KEEP) |
cut -d ' ' -f3- |
xargs -r -I FILE find FILE -mtime +$(MIN_DAYS_TO_KEEP) |
xargs -n1 rm

我不得不重构要使用的命令docker-compose,这就是结果。虽然它不是最优雅或最有效的解决方案。

于 2022-02-07T13:45:06.740 回答