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

Bash循环中目录切换问题:访问子目录WAV文件同时确保主目录配置文件可访问

解决Bash循环处理子目录文件时的路径问题

看起来你遇到的核心问题其实不是配置文件的访问(因为你已经cd到/usr/local/opensmile/,config/is09-13/IS10_paraling.conf这个相对路径是完全有效的),而是输出路径的构造或者文件名包含子目录前缀导致的异常。下面给你几个可行的解决方案,你可以根据需求选择:

方案1:提取纯文件名,统一输出到output目录

这种方法会去掉test-audio/前缀,把所有处理后的csv文件直接放在output目录下,避免创建子目录的麻烦:

#! /bin/bash
cd /usr/local/opensmile/
# 确保output目录存在,没有就创建
mkdir -p output

for f in test-audio/*.wav; do
    # 提取文件名(自动去掉路径前缀)
    filename="${f##*/}"
    # 给变量加双引号,防止文件名含空格或特殊字符导致报错
    /usr/local/opensmile/build/progsrc/smilextract/SMILExtract -C config/is09-13/IS10_paraling.conf -I "$f" -D output/"$filename".csv ;
done

方案2:提前创建输出子目录,保留原路径结构

如果你想保留test-audio的目录结构,把csv文件对应放在output/test-audio/下,只需要提前创建这个子目录即可:

#! /bin/bash
cd /usr/local/opensmile/
# 创建output/test-audio目录,-p参数会自动创建不存在的父目录
mkdir -p output/test-audio

for f in test-audio/*.wav; do
    /usr/local/opensmile/build/progsrc/smilextract/SMILExtract -C config/is09-13/IS10_paraling.conf -I "$f" -D output/"$f".csv ;
done

方案3:循环中临时切换目录(子shell方式)

如果你确实需要在循环里切换目录(比如某些命令依赖当前工作目录),可以用子shell临时切换,这样不会影响外部的工作目录:

#! /bin/bash
cd /usr/local/opensmile/
mkdir -p output

for f in test-audio/*.wav; do
    # 用()开启子shell,内部cd操作不会影响外部脚本的工作目录
    (
        cd test-audio/
        # 此时相对路径基于test-audio,所以配置文件要加../前缀
        ../build/progsrc/smilextract/SMILExtract -C ../config/is09-13/IS10_paraling.conf -I "$(basename "$f")" -D ../output/"$(basename "$f")".csv ;
    )
done

额外提示:

  • 永远给变量加上双引号(比如"$f"),否则如果你的wav文件名里有空格或特殊字符(比如test file.wav),脚本会直接报错。
  • mkdir -p是个非常实用的命令,它会自动创建所有不存在的父目录,避免"目录不存在"的错误。

内容的提问来源于stack exchange,提问作者bash-asker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:47:42