如何将现有遍历mov文件的for循环改写成可遍历所有子目录的递归循环
递归遍历子目录批量转换mov为mp4的修改方案
原脚本仅能处理当前目录下的.mov文件,存在两处可优化点:大写的Rm需改为系统默认的小写删除命令rm,无匹配文件时会把通配符本身作为文件名执行命令。
方案1:Bash原生globstar方案(推荐,适配Bash 4.0及以上版本)
# 开启递归通配、无匹配文件时跳过循环的选项 shopt -s globstar nullglob # 递归遍历所有层级子目录下的.mov文件 for i in **/*.mov; do ffmpeg -i "$i" "${i%.*}.mp4" -y rm "$i" done
说明:
globstar参数开启后,通配符**会匹配所有层级的子目录nullglob参数保证目录下无匹配的.mov文件时,不会进入循环执行命令- ffmpeg后加
-y参数可自动覆盖已存在的同名mp4文件,无需手动确认 - 无需删除原文件的话,直接去掉
rm "$i"行即可
方案2:find命令方案(兼容所有POSIX shell环境,适配性更强)
find . -type f -name "*.mov" -print0 | while IFS= read -r -d '' i; do ffmpeg -i "$i" "${i%.*}.mp4" -y rm "$i" done
说明:-print0和read -d ''的组合可以完美处理文件名带空格、特殊字符的场景,不会出现文件路径解析错误。
内容的提问来源于stack exchange,提问作者Peter Mark Friedladner
相关产品推荐
相关产品推荐

