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

问题描述 投票:0回答:1

我有以下问题:想象一下,你有一个名为“音乐”的目录,在那里,在各种子目录中,有以.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是可选的(但首选)。 在此先感谢您的帮助!

bash sh
1个回答
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 {} \;

How it works

  1. find ./Music -type f -name "*.flac" 搜索名称以-type f结尾的./Music目录下的常规文件(.flac)。
  2. -execdir sh -c '...' Cvt {} \; 对于这些文件,启动shell并在引号中运行命令。 flac文件的名称作为参数1提供给shell脚本:$1Cvt被分配给$0,如果shell脚本生成错误,您将看到它。 shell脚本包括: ffmpeg -i "$1" -ab 320k -map_metadata 0 -id3v2_version 3 -y "${1%.flac}.mp3" 运行您找到的ffmpeg命令。 && 仅当前面的命令成功(错误代码= 0)时才继续执行以下命令。 rm "$1" 删除原始flac文件。
© www.soinside.com 2019 - 2024. All rights reserved.