Linux下如何仅复制周日或每月7/14/21/28日生成的.bak备份文件
可以实现,优先使用备份文件名自带的日期字段做判断,相比依赖文件系统的创建/修改时间属性更稳定,不会因为文件迁移、二次修改等操作导致时间属性变化引发误判。
实现方案
方案1:全规则匹配(同时支持周日/固定日期判断,推荐)
直接改造原有find命令,对筛选出的文件提取文件名中的日期字段做规则校验后再执行拷贝:
find /data/src/ -iname "*.bak" -mmin +3 -type f | awk -F'_' '{ dt = $3"-"$4"-"$5 cmd = "date -d "dt" +%u" cmd | getline wk close(cmd) # %u返回1=周一、7=周日,匹配规则:周日 或 日期为07/14/21/28 if (wk == 7 || $5 ~ /^(07|14|21|28)$/) { print $0 } }' | xargs -I {} cp -n -p -v {} /data/dest
命令逻辑说明:
- 前置筛选规则和你原有逻辑完全一致,仅保留后缀为
.bak、修改时间超过3分钟的普通文件 - awk以
_为分隔符,提取文件名中的年($3)、月($4)、日($5)字段 - 调用date命令将提取的日期转换为周数,判断是否为周日
- 匹配任意规则的文件名会输出给后续xargs执行拷贝操作,拷贝参数和你原有设置完全一致
注意事项:
- 正式执行前可以把末尾的
cp -n -p -v {} /data/dest替换为echo "待拷贝文件:{}",先验证筛选出的文件是否符合要求,确认无误后再替换为实际拷贝命令 - 如果你使用的是macOS系统,date命令参数存在差异,把
date -d "dt" +%u替换为date -j -f "%Y-%m-%d" dt +%u即可
方案2:仅匹配固定日期(临时快速筛选用)
如果不需要判断周日的规则,仅需匹配每月7/14/21/28的备份,可以直接用grep匹配文件名:
find /data/src/ -iname "*.bak" -mmin +3 -type f | grep -E '_20[0-9]{2}_[0-9]{2}_(07|14|21|28)_' | xargs -I {} cp -n -p -v {} /data/dest
该方案不支持动态判断周日,仅适合临时筛选固定日期的备份使用。
内容的提问来源于stack exchange,提问作者sql_usr001
相关产品推荐
相关产品推荐

