如何重命名目录中同前缀文件对的最旧文件(含批量方案)
单个文件对的重命名方法
方法1:支持含空格/特殊字符的文件名(推荐)
find . -name '0772*' -print0 | ls -rt --zero | head -z -n1 | xargs -0 -I {} mv {} {}.old
- 核心逻辑:
- 用
-print0、--zero、-z系列参数处理特殊文件名,避免拆分错误 ls -rt按修改时间从旧到新排序文件head -z -n1筛选出最旧的文件xargs将文件路径传入mv完成重命名
- 用
方法2:简单命令替换(仅适用于无空格文件名)
mv "$(find . -name '0772*' | ls -rt | head -1)" "$(find . -name '0772*' | ls -rt | head -1)".old
批量处理所有文件对的方案
单行命令(仅当前目录,无特殊字符文件名)
for p in $(ls | grep -E '^[0-9]{4}' | cut -c1-4 | sort -u); do f=($(ls -rt $p*)); [ ${#f[@]} -ge 2 ] && mv "${f[0]}" "${f[0]}_old"; done
通用Bash脚本(支持子目录、特殊字符文件名)
#!/bin/bash # 提取所有四位数字开头的文件前缀并去重 find . -type f -name '[0-9][0-9][0-9][0-9]*' | sed -E 's/^(.*\/)?([0-9]{4}).*/\2/' | sort -u | while read -r prefix; do # 按修改时间戳排序,获取当前前缀下的所有文件(最旧在前) files=($(find . -type f -name "$prefix*" -printf '%T@ %p\n' | sort -n | cut -d' ' -f2-)) # 仅当文件数≥2时(成对)才执行重命名 if [ ${#files[@]} -ge 2 ]; then mv "${files[0]}" "${files[0]}_old" echo "已重命名: ${files[0]} -> ${files[0]}_old" fi done
- 优势:
- 用时间戳排序比
ls -rt更精准,不受文件名影响 - 自动遍历子目录中的目标文件
- 兼容含空格、特殊字符的文件名
- 用时间戳排序比
内容的提问来源于stack exchange,提问作者Oppy
相关产品推荐
相关产品推荐

