You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重命名目录中同前缀文件对的最旧文件(含批量方案)

单个文件对的重命名方法

方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:51:03