如何在Bash中递归为文件加字母序列前缀,实现电视按序播放?
在Bash中递归为视频文件添加字母序列前缀以实现正确播放顺序
问题场景
你的U盘子目录中存在一批视频文件,原文件名示例如下:
1- Lists.mp4 10- Filter Function.mp4 11- List Comprehensions.mp4 12- Zip Function.mp4 13- Stacks.mp4 2- Accessing Items.mp4 20- Dictionary Comprehensions.mp4
由于电视会按错误的字典序排序播放,需要将文件重命名为带字母序列前缀的形式,示例如下:
a 1- Lists.mp4 b 2- Accessing Items.mp4 c 10- Filter Function.mp4 d 11- List Comprehensions.mp4 e 12- Zip Function.mp4 f 13- Stacks.mp4 g 20- Dictionary Comprehensions.mp4
以此实现按正确顺序连续播放。
解决方案
以下是可直接使用的Bash脚本,实现递归遍历文件、按数字自然排序、生成字母序列前缀并重命名的完整流程:
#!/bin/bash # 将数字转换为a→z→aa→ab...形式的字母前缀 generate_prefix() { local num=$1 local prefix="" while (( num > 0 )); do (( num-- )) local char_code=$(( num % 26 + 97 )) prefix=$(printf "\\$(printf '%03o' $char_code)")$prefix (( num /= 26 )) done echo "$prefix" } # 初始化前缀索引(从0开始对应第一个文件的a前缀) i=0 # 递归查找所有mp4文件,按文件名前缀数字自然排序后遍历 find . -type f -name "*.mp4" -print0 | sort -zV | while IFS= read -r -d '' file_path; do # 拆分文件路径为目录和文件名 file_dir=$(dirname "$file_path") file_name=$(basename "$file_path") # 生成对应字母前缀 current_prefix=$(generate_prefix $((i++))) # 构造新文件名 new_file_name="${current_prefix} ${file_name}" new_file_path="${file_dir}/${new_file_name}" # 先打印重命名操作(测试阶段),确认无误后可移除echo直接执行mv echo mv -v "$file_path" "$new_file_path" # mv -v "$file_path" "$new_file_path" done
脚本说明
- 字母前缀生成:
generate_prefix函数将递增数字转换为要求的字母序列,0对应a,25对应z,26对应aa,以此类推。 - 文件遍历与排序:
find命令递归查找所有.mp4文件,sort -zV确保文件名按前缀数字自然排序(避免1、10、2的错误顺序),同时处理含空格的文件名。 - 重命名操作:遍历排序后的文件,为每个文件生成对应的字母前缀,构造新文件名。测试阶段保留
echo仅打印操作,确认正确后再移除echo执行实际重命名。
注意事项
- 执行前请先备份文件,或在测试目录验证脚本效果,避免误操作导致文件丢失。
- 若存在非数字开头的
.mp4文件,排序结果可能不符合预期,需根据实际文件名格式调整排序逻辑。
内容的提问来源于stack exchange,提问作者KaMZaTa
相关产品推荐
相关产品推荐

