如何修改Delete_Silent脚本使其在所有子目录中运行?
解决方案:递归遍历所有子目录的WAV文件
针对你的需求,要让脚本处理任意层级子目录里的.wav文件,有两种简单且可靠的方法:
方法一:使用find命令(兼容性强)
直接用find命令递归查找所有.wav文件,再逐个处理,替换原来的for循环即可:
find . -type f -name "*.wav" | while read -r wav do V=$($sox "$wav" -n stat 2>&1 | grep "Maximum amplitude" | cut -d ":" -f 2 | sed 's/ //g') if [[ $(echo "if ("$V" > "$MAX") 1 else 0" | bc) -eq 0 ]] then if [ $safe = 0 ] then echo "Deleting Data" rm -rfv "$wav" else echo "Running in Safe Mode" echo "Would delete $wav"; fi else echo "File $wav not silent" fi done
find . -type f -name "*.wav":从当前目录(.)开始,递归查找所有类型为文件(-type f)、后缀为.wav的文件while read -r wav:逐个读取find输出的文件路径,赋值给变量wav,-r参数避免处理特殊字符时出错
方法二:开启Bash的globstar选项(写法简洁)
如果你的Cygwin使用的是Bash 4.0及以上版本(绝大多数现代Cygwin都满足),可以开启递归匹配的glob功能,写法更简洁:
在脚本开头先添加开启globstar的命令,再修改for循环的匹配规则:
# 开启递归glob匹配 shopt -s globstar for wav in **/*.wav do V=$($sox "$wav" -n stat 2>&1 | grep "Maximum amplitude" | cut -d ":" -f 2 | sed 's/ //g') if [[ $(echo "if ("$V" > "$MAX") 1 else 0" | bc) -eq 0 ]] then if [ $safe = 0 ] then echo "Deleting Data" rm -rfv "$wav" else echo "Running in Safe Mode" echo "Would delete $wav"; fi else echo "File $wav not silent" fi done
shopt -s globstar:开启Bash的递归匹配功能,**会匹配任意层级的子目录**/*.wav:匹配当前目录及所有子目录下的.wav文件
两种方法都能正确处理包含空格的文件名(因为所有引用$wav的地方都加了双引号),你可以根据自己的习惯选择。
内容的提问来源于stack exchange,提问作者manymanyhaha
相关产品推荐
相关产品推荐

