UNIX下基于日期逻辑清理目录文件、保留指定文件的方案咨询
实现方案
优先用文件名自带的日期逻辑处理,比解析ls输出、读取文件修改时间更稳定,不会受系统区域设置、文件被意外修改修改时间的影响:
步骤1:确认保留文件数量
你现有命令ls -ltr Test* | grep \date +%b` | head -2 只会保留2个文件,如果你的需求是保留当月最早2天的所有文件(每天对应ctl和txt共4个),把下方的KEEP_NUM`改成4即可。
步骤2:测试删除逻辑(先不执行真实删除)
执行以下命令,会打印出待删除的文件列表,先核对是否符合预期:
# 定义需要保留的当月文件数量 KEEP_NUM=2 # 获取当前年月,格式为YYYYMM,匹配文件名前缀 CUR_MONTH=$(date +%Y%m) # 按文件名升序排序(对应日期从早到晚),跳过前KEEP_NUM个,打印待删除文件 ls Test${CUR_MONTH}* | sort | tail -n +$((KEEP_NUM + 1)) | xargs echo rm
步骤3:执行实际删除
确认待删除列表无误后,把命令里的echo rm改成rm即可。
定时任务配置
把确认可用的命令写入shell脚本,添加到crontab实现每月末自动执行,示例配置(每月最后一天23点运行):
0 23 28-31 * * [ "$(date +%d -d tomorrow)" = "01" ] && /bin/bash /path/to/clean_script.sh
补充说明
如果你的场景必须依赖文件修改时间而非文件名日期,用以下更稳定的find方案,避免解析ls的兼容性问题:
# 仅查找当月修改的Test开头文件,按修改时间升序,跳过前2个删除(先加echo测试) find . -maxdepth 1 -type f -name "Test*" -newermt "$(date +%Y-%m-01)" \ -printf "%T@ %p\n" | sort | tail -n +3 | cut -d' ' -f2- | xargs echo rm
内容的提问来源于stack exchange,提问作者HookUp
相关产品推荐
相关产品推荐

