如何让Bash脚本按本地化不区分大小写字母顺序枚举MP4文件并获取尺寸
问题
我需要枚举目录中的所有MP4视频文件,并使用FFmpeg的ffprobe工具获取它们的尺寸。目前使用以下Bash脚本可正常运行:
for filename in *.mp4; do printf "$filename;" ffprobe -v error -select_streams v -show_entries stream=width,height -of csv=p=0:s=";" ${filename} done
执行后得到如下CSV格式结果:
video7.mp4;320;200 video1.mp4;800;600 videoAlpha.mp4;1024;1024
现在希望将文件按本地化、不区分大小写的字母顺序进行枚举,请问该如何修改脚本?
解决方案
要实现目标排序效果,可通过以下两种方式修改脚本:
方法一:临时配置本地化排序规则
在循环前设置LC_COLLATE环境变量,让Bash的通配符展开自动遵循本地化的不区分大小写排序规则:
# 以en_US.UTF-8为例,可替换为你实际使用的本地化标识 LC_COLLATE=en_US.UTF-8 for filename in *.mp4; do printf "$filename;" ffprobe -v error -select_streams v -show_entries stream=width,height -of csv=p=0:s=";" "$filename" done # 可选:执行完后恢复原有环境设置 # unset LC_COLLATE
注:若你的系统默认本地化已支持不区分大小写排序,可省略环境变量设置,但显式配置能保证跨环境的一致性。
方法二:显式排序文件列表
如果不想改动全局环境变量,可以先提取MP4文件列表,用sort命令完成本地化不区分大小写排序后再循环处理:
for filename in $(ls -1 *.mp4 | sort -f --locale=current); do printf "$filename;" ffprobe -v error -select_streams v -show_entries stream=width,height -of csv=p=0:s=";" "$filename" done
-f参数让sort忽略大小写差异--locale=current指定使用当前系统的本地化排序规则,确保排序符合区域习惯
两种方法都能让输出按video1.mp4、video7.mp4、videoAlpha.mp4的顺序排列。
内容的提问来源于stack exchange,提问作者Duck
相关产品推荐
相关产品推荐

