You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:23:39