bash - 用于删除旧备份文件的现有 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。但是下面的逻辑我理解不正确。
解决方案
这个答案不完整,因为我缺乏信息。此外,它应该完成的任务似乎过于复杂。
下面的循环处理 /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
- 根据stat (OSX)的手册页:
-f
format 使用指定的格式显示信息。有关有效格式的说明,请参阅格式部分。-t
timefmt 使用指定格式显示时间戳。此格式直接传递给strftime (3)。- 根据手册页的FORMATS部分,是和
%Sm
的组合,分别代表 1)“[最后]时间文件 [...]被修改”()和 2)格式化,“如果适用,应该是字符串格式" ( ,这里应该是这种情况)。S
m
m
S
- 根据strftime
%m %V %d
的手册页,以十进制数表示月份、年份中的星期数和月份中的日期。
- 输出
read
存储在变量中MONTH
WEEK
和DAY
(-s
代表静默模式)
此时,您有月份、一年中的周数和文件被修改时的月份中的日期。
接下来最难的部分:
如果之前处理过的文件的修改天数等于当前处理过的文件天数,则检查是否在
-mtime
一周前被修改过()(KEEP_FULL
=7);如果是这样,删除它(f
传递给rm
withxargs
):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
循环标准输入的第一个输出文件的顺序。
推荐阅读
- python - 如何从 Python 中的多变量分布中边缘化变量?
- hive - sqoop 未按预期工作 来自源的 NULL Sting 填充为 \\N
- javascript - React does not recognize the prop passed to a styled-component within Material UI
- c# - 如何在c#中添加具有泛型的抽象类作为委托的参数
- android - 使用导航组件和导航图在 Fragment(非活动)内使用 BottomNavigationView 导航
- c++ - 无法创建包含对象的矢量
- operating-system - 具有 2 个级别的分层分页
- python - 比较 Pandas Dataframe 时间窗口内的布尔变量
- asp.net-core - AzureADB2C.UI - 访问 OpenIdConnectEvents (OnTokenValidated)
- javascript - 用于 Web 应用程序自动化的浏览器堆栈的替代方案