需求,当前目录有一批视频文件名如下,在视频播放器打开目录,排序就乱了
[1]1.1 Name1
[11]10.11 Name2
[101]10.11.1 Name3
[11]10.11 Name2
[101]10.11.1 Name3
希望将文件名重命名为:
[001]01.01 Name1
[011]10.11 Name2
[101]10.11.01 Name3
[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
# 递归扫描当前目录下的所有文件
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
当前还没有任何评论