我是一个脚本初学者。我对旧脚本有一些疑问,应该删除旧的备份文件。
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。但是以下逻辑我无法正确理解。
由于我缺乏信息,因此该答案将是不完整的。同样,它应该完成的任务似乎过于复杂。
下面的循环处理/ 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
stat
在文件上调用 f
-f
格式使用指定格式显示信息。有关有效格式的说明,请参见“格式”部分。
-t
timefmt使用指定的格式显示时间戳。该格式直接传递给strftime(3)。
%Sm
是的组合S
和m
),其分别放置1“的[最后]时文件是[...]改性”( m
)和2)格式化,“如果适用的话,应该是字符串格式”(S
在这里应该是这种情况)。%m %V %d
代表月,年的周号和月的天(以十进制数表示)read
并存储在变量中MONTH
WEEK
,DAY
(-s
代表静默模式)在这一点上,你有一个月,在这一年的周数和月份的日的文件体改时间。
接下来最难的部分:
如果先前处理过的文件的修改日期等于当前处理过的文件的一天,则检查该文件是否在-mtime
一周前被修改()(KEEP_FULL
= 7);如果是这样,将其删除(f
被传递到rm
与xargs
):
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] 删除。
我来说两句