关于bash:将在主目录的任何子目录中找到的所有.flac格式的文件转换为.mp3

 2021-04-09 

Convert all files of .flac format found in any sub-directory of main directory to .mp3

我遇到以下问题:假设您有一个名为" Music"的目录,并且在其中的各个子目录中都有以.flac结尾的文件。
我想编写一个bash脚本来查找所有这些文件,并针对每个文件
转换为找到的目录,.mp3文件,以及(可选)在正确创建此文件以删除原始.flac文件的情况下进行的转换。

我尝试了以下代码,该代码是通过从各个地方收集点点滴滴而构建的,这些代码作为我要实现的目标的更正式说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

find ./Music -type f -name"*.flac" -print0 | while read -d $'\\0' a; do
    echo"converting file: $a"

    # Get File name
    FN=`echo $a | sed 's/.\\{5\\}$//'`

    # Convert to mp3
    ffmpeg -i"$FN.flac" -ab 320k -map_metadata 0 -id3v2_version 3 -y"$FN.mp3"

    # If converted correctly delete
    if [ -f"$FN.mp3" ]; then
        echo"done"
        rm"$a"
    fi
done

使用ffmpeg是可选的(但首选)。
预先感谢您的帮助!


尝试:

1
find ./Music -type f -name"*.flac" -execdir sh -c 'ffmpeg -i"$1" -ab 320k -map_metadata 0 -id3v2_version 3 -y"${1%.flac}.mp3" && rm"$1"' Cvt {} \\;

怎么运行的

  • find ./Music -type f -name"*.flac"

    在目录./Music下搜索名称以.flac结尾的常规文件(-type f)。

  • -execdir sh -c '...' Cvt {} \\;

    对于这些文件,启动外壳并运行带引号的命令。 flac文件的名称作为参数1:$1

    提供给Shell脚本。

    Cvt被分配给$0,如果Shell脚本生成错误,您将看到

    shell脚本包括:

    • ffmpeg -i"$1" -ab 320k -map_metadata 0 -id3v2_version 3 -y"${1%.flac}.mp3"

      运行找到的ffmpeg命令。

    • &&

      仅在先前命令成功执行(错误代码= 0)时,才继续执行以下命令。

    • rm"$1"

      删除原始flac文件。