我有一个名为 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