现有的用于删除旧备份文件的bash脚本-它如何工作?

幻影

我是一个脚本初学者。我对旧脚本有一些疑问,应该删除旧的备份文件。

KEEP_FULL=7
KEEP_DAILY=14
KEEP_WEEKLY=30

DB_FULL_PATH=/Volumes/path

LAST_DAY=0
LAST_WEEK=0
LAST_MONTH=0
find $DB_FULL_PATH -type f| while read f; do
    < <(stat -f %Sm -t "%m %V %d" $f) read -s MONTH WEEK DAY 
    if [ $DAY -eq $LAST_DAY ]; then
        find $f -mtime +$KEEP_FULL | xargs rm 
    else if [ $WEEK -eq $LAST_WEEK ]; then
        find $f -mtime +$KEEP_DAILY | xargs rm 
    else if [ $MONTH -eq $LAST_MONTH ]; then
        find $f -mtime +$KEEP_WEEKLY | xargs rm 
    fi fi fi
    export LAST_DAY=$DAY
    export LAST_WEEK=$WEEK
    export LAST_MONTH=$MONTH
done

有人可以解释一下(对于假人)while循环中发生了什么吗?我知道对于文件夹中的每个文件,信息(创建的天,周,月)都写入$ MONTH $ WEEK $ DAY。但是以下逻辑我无法正确理解。

Amessihel

由于我缺乏信息,因此该答案将是不完整的。同样,它应该完成的任务似乎过于复杂。


下面的循环处理/ Volumes / path下的所有文件,并将它们存储在变量中f

find $DB_FULL_PATH -type f| while read f; do
    # [...]
done

对于每个文件f,首先执行以下命令:

< <(stat -f %Sm -t "%m %V %d" $f) read -s MONTH WEEK DAY 
  1. stat 在文件上调用 f

    -f 格式使用指定格式显示信息。有关有效格式的说明,请参见“格式”部分。

    -t timefmt使用指定的格式显示时间戳。该格式直接传递给strftime(3)。

    • 根据FORMATS手册页的部分,%Sm是的组合Sm),其分别放置1“的[最后]时文件是[...]改性”( m和2)格式化,“如果适用的话,应该是字符串格式”(S在这里应该是这种情况)。
    • 根据strftime的手册页%m %V %d代表,年的周号天(以十进制数表示)
  2. 输出是read并存储在变量中MONTH WEEKDAY-s代表静默模式

在这一点上,你有一个月,在这一年的周数月份的日的文件体改时间。

接下来最难的部分:

  • 如果先前处理过的文件的修改日期等于当前处理过的文件的一天,则检查该文件是否在-mtime一周前被修改()(KEEP_FULL= 7);如果是这样,将其删除(f被传递到rmxargs):

    if [ $DAY -eq $LAST_DAY ]; then
        find $f -mtime +$KEEP_FULL | xargs rm 
    fi
    
  • 否则,如果先前处理过的文件修改的那年的第几周(呼吸)等于当前处理过的文件修改的年数,则检查它是否在两周前被修改(KEEP_DAILY= 14);如果是这样,请将其删除:

      else if [ $WEEK -eq $LAST_WEEK ]; then
          find $f -mtime +$KEEP_DAILY | xargs rm
    
  • 否则,如果先前处理文件的修改月份(sips)等于当前处理文件的修改月份,则检查它是否在30天之前被修改(KEEP_WEEKLY= 30);如果是这样,请将其删除:

      else if [ $MONTH -eq $LAST_MONTH ]; then
          find $f -mtime +$KEEP_WEEKLY | xargs rm 
      fi fi fi
    
  • 检索当前文件的月,周和日以与它们一起处理下一个文件(将用作所述“先前处理”文件的修改时间的一部分):

        export LAST_DAY=$DAY
        export LAST_WEEK=$WEEK
        export LAST_MONTH=$MONTH
    done
    

也就是说,要了解为什么执行这种比较,您需要知道第一个find输出文件注入到while循环的标准输入的顺序

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用bash脚本删除备份文件?

Powershell:删除旧的备份文件但保留最近的文件,即使它较旧

使用任务计划程序,如何备份文件夹并删除旧备份

Bash管道信号传播-它如何工作?

带有节点的OpenVPN,它如何工作?

如何从bash脚本中删除root拥有的文件?

如何删除临时/备份文件

如何删除隐藏的备份文件?

spring boots 如何工作,它如何加载所有配置

适用于Android的Mono-它如何工作?

TensorFlow中* .pb文件的用途是什么,它如何工作?

什么是IOR文件,它做什么用,如何工作?

std ::任何没有RTTI的东西,它如何工作?

当它的所有“部分”都是“i++”时,“for”如何工作?

有点奇怪的Java代码,它如何工作?

在删除Realm文件之前,如何在Android中备份Realm DB。有什么办法可以还原备份文件?

如何使用sed命令删除没有备份文件的行?

Proftpd mod_rewrite 没有按预期工作。我如何使它正常工作?

如何使用bash脚本删除其他用户拥有的文件?

如何从旧的重复备份中删除文件?

如何通过修改我糟糕的批处理编程脚本来制作带有日期和时间的备份文件?

Passport的注销功能会删除cookie吗?如果没有,它如何工作?

如何在git repo中找到现有的旧文件

备份疑虑:如何使用备份文件

For 循环适用于初学者 - 它如何在 R 中更好地工作?

如何编写脚本以删除所有旧的WiFi配置文件,但保留当前的工作配置文件

使用SVNKit使用完工作副本后,如何删除它?

特大文件的python“ cksum”等价物是什么,它如何工作?

文件终端命令是否包含/ *-如何防止它注释掉进一步的工作?