【问题标题】:existing bash script for deleting old backup files - how does it work?用于删除旧备份文件的现有 bash 脚本 - 它是如何工作的?
【发布时间】:2021-01-22 14:56:37
【问题描述】:

我是脚本的初学者。我有一些关于旧脚本的问题,它应该删除旧的备份文件。

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 OS Yosemite (10.10.5) 使用 bash 命令运行;脚本名 ist test.sh: (bash test.sh)
  • @Amessihel 该脚本应该删除旧的备份文件,并且可以正常运行很长时间(不是我的)。有更好的方法吗?

标签: bash shell osx-yosemite


【解决方案1】:

这个答案不完整,因为我缺乏信息。此外,它应该完成的任务似乎过于复杂。


下面的循环处理/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. 在文件f 上调用stat

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

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

    • 根据手册页的FORMATS部分,%SmSm 的组合,分别代表1)“[最后]时间文件是[ ...] modified" (m) 和 2) 格式化,“如果适用,应该是字符串格式”(S,这里应该是这种情况)。
    • 根据strftime 的手册页,%m %V %d 代表月份一年中的周数月份中的某天为十进制数
  2. 输出为read并存储在变量MONTHWEEKDAY中(-s代表silent mode

此时,您有了文件时间的一年中的周数月中的日期已修改。

接下来是最难的部分:

  • 如果之前处理过的文件的修改天数等于当前处理过的文件天数,则检查是否在一周前被修改过(-mtime) (KEEP_FULL=7);如果是这样,请将其删除(fxargs 一起传递给 rm):

    if [ $DAY -eq $LAST_DAY ]; then
        find $f -mtime +$KEEP_FULL | xargs rm 
    fi
    
  • 否则,如果之前处理的文件修改年份的周数(breathes)等于当前处理的文件一,则检查它是否在两周前被修改(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 循环的标准输入的顺序。

【讨论】:

  • 哇,非常感谢!!!第一个 find 输出最新的文件。您已经说过,对于它应该完成的任务,脚本似乎过于复杂。你知道更好的方法吗?我会就这件事提出一个新问题。
  • 不客气!这实际上取决于如何您要保留或不备份文件。我建议你自己尝试,当你遇到困难时,提出具体的问题,即把你的问题分解成更小的点。这样一来,努力就会显得更加明显,并且您更有可能获得帮助。另见How to ask a good question?祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 2021-07-19
  • 2014-07-23
  • 1970-01-01
  • 2015-05-27
相关资源
最近更新 更多