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
相关产品推荐
相关产品推荐

