AI代码 使用shell对当前目录文件名进行整理

需求,当前目录有一批视频文件名如下,在视频播放器打开目录,排序就乱了

[1]1.1 Name1
[11]10.11 Name2
[101]10.11.1 Name3

希望将文件名重命名为:

[001]01.01 Name1
[011]10.11 Name2
[101]10.11.01 Name3

然后AI大法处理各种异常,耗时近半小时改完300个文件

#!/bin/bash

# 递归扫描当前目录下的所有文件
find . -type f | while read -r file; do
    # 获取文件名(不含路径)
    filename=$(basename "$file")

    # 使用正则匹配 [数字]数字.数字. 或 [数字]数字.数字.数字. 格式
    if [[ $filename =~ ^(\[)([0-9]+)(\])([0-9]+)\.([0-9]+)(\.([0-9]+))?\. ]]; then
        # 提取匹配的数字并转换为十进制
        num1=$((10#${BASH_REMATCH[2]}))  # 第一个数字 [xxx]
        num2=$((10#${BASH_REMATCH[4]}))  # 第二个数字
        num3=$((10#${BASH_REMATCH[5]}))  # 第三个数字
        num4="${BASH_REMATCH[7]}"        # 第四个数字(可能不存在)

        # 获取完整的匹配部分
        original_start="${BASH_REMATCH[0]}"

        # 根据是否存在第四个数字构造新的格式化开头
        if [ -n "$num4" ]; then
            num4=$((10#$num4))  # 转换第四个数字为十进制
            formatted_start=$(printf "[%03d]%02d.%02d.%02d." "$num1" "$num2" "$num3" "$num4")
        else
            formatted_start=$(printf "[%03d]%02d.%02d." "$num1" "$num2" "$num3")
        fi

        # 使用 sed 进行替换(转义特殊字符)
        escaped_original=$(printf '%s\n' "$original_start" | sed 's/[[\.*^$/]/\\&/g')
        new_filename=$(printf '%s\n' "$filename" | sed "s/^$escaped_original/$formatted_start/")

        # 如果新旧文件名不同,则输出重命名命令
        if [ "$filename" != "$new_filename" ]; then
            # 获取文件所在目录路径
            dir=$(dirname "$file")
            echo "mv "$file" "$dir/$new_filename""
        fi
    fi
done

当前还没有任何评论

写下你最简单的想法