【问题标题】:How to loop through files in subdirectories?如何遍历子目录中的文件?
【发布时间】:2021-07-09 13:54:21
【问题描述】:

我正在尝试将一堆 .aac 文件转换为目录中单独子目录中的 .mp3 文件。这是我写的代码:

for dir in */
do
    OUTPUT_DIR=./mp3
    mkdir "$OUTPUT_DIR"
    for i in *.aac;
      do name=`echo "$i" | cut -d'.' -f1`
      echo "$name"
      ffmpeg -i "$i" -vn -ar 44100 -ac 2 -b:a 192k "$OUTPUT_DIR/${name}.mp3"
    done
done

但是,这只是尝试在外部目录中运行命令并给出错误。我是 bash 的新手,所以这可能是一个我没有看到的非常简单的错误。

【问题讨论】:

    标签: bash


    【解决方案1】:

    如何遍历子目录中的文件?

    阅读前How to loop through a directory recursively to delete files with certain extensions

    这是我写的代码:

    使用http://shellcheck.net检查您的脚本

    不要使用`。请改用$(...)

    要获取文件名和目录,请参见 basenamedirname 命令。当目录中有一个点时,您的name=echo "$i" | cut -d'.' -f1 将失败。

    在此处使用printf "%s\n" "$i" 或bash 中的<<<"$i" 字符串代替echo "$i" |。见前。 https://unix.stackexchange.com/questions/65803/why-is-printf-better-than-echo.

    在您的脚本中首选小写变量。

    所以这可能是一个我没有看到的非常简单的错误。

    你根本没有改变目录。你需要cd 到那个目录的某个地方,然后cd - 返回(或pushd + popd)。但无论如何,只是参考相对于您当前目录的目录。也许还有一些东西:

    for dir in ./*/; do
        # create the directory in dir
        output_dir="./$dir/mp3"
        mkdir "$output_dir"
        # find files aac inside $dir/
        for i in "$dir"/*.aac; do
           name=$(basename "$i" .acc)
           echo "$name"
           ffmpeg -i "$i" -vn -ar 44100 -ac 2 -b:a 192k "$output_dir/${name}.mp3"
        done
    done
    

    【讨论】:

    • 这个回答好详细又清晰,肯定学到了东西,解决了问题,谢谢!
    【解决方案2】:

    您可能希望使用find 递归查找目录的所有子目录中的所有文件。

    这是一个示例(假设您还想在输出目录中重新创建子目录)。

    OUTPUT_DIR=./mp3
    
    for item in $(find . -type f -name *.aac); do
        name="$(basename $item .aac)"
        subdir="$(dirname $item)"
        mkdir -p "$OUTPUT_DIR/$subdir"
        ffmpeg -i "$name" -vn -ar 44100 -ac 2 -b:a 192k "$OUTPUT_DIR/$subdir/$name.mp3"
    done
    

    【讨论】:

    • 我什至不知道 find 存在,我会阅读它,谢谢!
    猜你喜欢
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2011-03-10
    • 1970-01-01
    • 2014-10-02
    • 2016-01-22
    • 2020-05-19
    相关资源
    最近更新 更多