如何在Unix系统中按文件名规则删除含JP标识的过期文件?
删除Unix系统中含指定标识且日期早于指定值的文件
我来帮你搞定这个需求!在Unix系统下,我们可以借助find命令结合简单的字符串处理,精准匹配并删除符合条件的文件,下面是具体实现方案:
核心命令(针对指定日期2018_03_21)
首先推荐你先使用预览版本确认要删除的文件,避免误删:
find . -type f -name "*JP*_????_??_??.info" -exec bash -c ' target_date="2018_03_21" # 从文件名中提取日期部分(去掉前缀下划线) file_date=$(echo "$1" | grep -o "_[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}" | cut -c2-) # 利用YYYY_MM_DD格式的字符串特性直接比较大小 if [[ "$file_date" < "$target_date" ]]; then echo "待删除文件:$1" # 确认无误后,取消下面这行的注释执行删除 # rm "$1" fi ' _ {} \;
命令拆解说明
find . -type f -name "*JP*_????_??_??.info":在当前目录及所有子目录中,查找文件类型、文件名包含JP且符合xxxx_YYYY_MM_DD.info格式的文件。-exec bash -c '...' _ {} \;:对每个找到的文件,调用bash子脚本进行日期判断。file_date=$(...):通过正则匹配提取文件名中的日期段(比如从run.sh_JP_2018_03_19.info中提取出2018_03_19)。[[ "$file_date" < "$target_date" ]]:由于我们的日期格式是YYYY_MM_DD,字符串的字典序和实际日期的先后顺序完全一致,所以直接用字符串比较就能判断文件日期是否早于目标日期。
更灵活的版本(支持传入目标日期参数)
如果日后需要频繁修改目标日期,可以把日期作为外部参数传入,不用每次修改脚本内容:
# 先定义目标日期,执行时修改这个值即可 TARGET_DATE="2018_03_21" find . -type f -name "*JP*_????_??_??.info" -exec bash -c ' file_date=$(echo "$1" | grep -o "_[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}" | cut -c2-) if [[ "$file_date" < "$2" ]]; then echo "待删除文件:$1" # rm "$1" fi ' _ {} "$TARGET_DATE" \;
安全提示
- 务必先预览:执行删除前一定要先运行带
echo的版本,确认列出的文件都是你想要删除的,避免误删重要文件。 - 限制查找范围:如果不需要递归查找子目录,给
find命令加上-maxdepth 1参数,比如find . -maxdepth 1 -type f ...,只在当前目录查找。 - 特殊字符兼容:这个命令已经考虑了文件名含空格、特殊字符的情况,
find会正确传递文件名给子脚本。
内容的提问来源于stack exchange,提问作者Djeah
相关产品推荐
相关产品推荐

