仅对子文件夹中的某些文件运行命令,具体取决于其他文件

仅对子文件夹中的某些文件运行命令,具体取决于其他文件

我有一个名为 Music 的文件夹,里面有不同艺术家的子文件夹,包含大量 .flac 文件。我试图将它们全部转换为 .wav 文件格式,然后将它们转换为 Apple alac,因为直接转换无法正常工作,但问题是我之前转换过其中一些,但不是全部。

我的文件夹基本上是这样的:

音乐/ArtistX/Song1.flac

音乐/ArtistX/Song1.m4a

音乐/ArtistX/Song2.flac

音乐/ArtistY/Song1.flac

音乐/艺术家/歌曲1.m4a

基本上,我想要一个命令,让我只转换没有对应 .m4a 文件的 .flac 文件。过去,我只是通过运行这个粗糙的 for 循环再次转换所有文件:

for f in ./**/*.flac; do ffmpeg -i "$f" "${f%.*}.wav"; done && for f in ./**/*.wav; do ffmpeg -n -i "$f" -acodec alac "${f%.*}.m4a"; done && find . -type f -name '*.wav' -delete

但这对于我当前的设置来说效率非常低。

PS:如果可能的话我更愿意使用 ffmpeg。

答案1

为什么不直接搜索 flac 文件,检查是否存在 m4a 文件,如果不存在 m4a 文件则进行转换?举个小例子:

for i in $(find $PWD -name "*.flac")
do
    # check if file was already converted and therefore a m4a file exists
    if [ ! -e $(dirname ${i})/$(basename ${i} .flac).m4a ]
    then
       # convert your file... File including path is in ${i}
       echo "Need to convert input file ${i} now..."
       WAV=$(dirname ${i})/$(basename ${i} .flac).wav
       M4A=$(dirname ${i})/$(basename ${i} .flac).m4a
       ffmpeg -i ${i} ${WAV}
       ffmpeg -n -i ${WAV} -acodec alac ${M4A}
       rm ${WAV}
    fi
done

相关内容