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

时间:2017-12-24 00:19:56

标签: bash sh

我有以下问题:想象一下,你有一个名为" Music"的目录。在那里,在各种子目录中,有以.flac结尾的文件 我想写一个bash脚本,找到所有这些文件和每个文件 转换到找到的目录,.mp3文件和(可选)如果正确创建此文件以删除原始.flac文件。

我尝试了以下代码,我通过收集来自不同地方的点点滴集来构建,我将其留下作为我想要实现的更正式的指示:

#!/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 个答案:

答案 0 :(得分:2)

尝试:

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 {} \;

如何运作

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

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

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

    对于这些文件,启动shell并在引号中运行命令。 flac文件的名称作为参数1提供给shell脚本:$1

    Cvt已分配给$0,如果shell脚本生成错误,您将看到它。

    shell脚本包括:

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

      运行您找到的ffmpeg命令。

    • &&

      仅当前面的命令成功(错误代码= 0)时才继续执行以下命令。

    • rm "$1"

      删除原始的flac文件。