Wav形式の曲がいくつかあります。それらをflac(これもロスレスですが圧縮されています)に変換したいと思います。
ソリューションは、.wavまたは.WAVファイル(理想的には大文字と小文字を区別しない)を見つけ、.flacに変換し、.flacファイルを別のディレクトリツリーに出力するために、サブディレクトリを再帰的に検索する必要があります。元のwavファイルは〜/ Musicにあり、出力flacファイルは〜/ Music_Flacに入れることができます。
私はArch Linux x86_64を使用していて、次のようにffmpegを持っています:
ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 7.3.0 (GCC)
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbluray --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-shared --enable-version3 --enable-omx
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
find
+ ffmpeg
ソリューション:
find ~/Music -type f -iname "*.wav" -exec sh -c \
'bn=${1##*/}; bn=${bn%.*}; ffmpeg -loglevel 16 -i "$1" "${0}${bn}.flac"' ~/Music_Flac/ {} \;
$0
-宛先ディレクトリとしてシェルコマンドに渡されます~/Music_Flac/
$1
-ファイルパスとしてシェルコマンドに渡されます{}
bn=${1##*/}
-ディレクトリパスのないファイルベース名bn=${bn%.*}
-拡張子が切り捨てられたファイルのベース名-loglevel 16
-ログレベルを設定します16
はffmpeg
が使用別のオプションは、bashのグロビングを使用してwavファイルを検索し、次にシェルパラメータ拡張機能を使用してディレクトリ構造とファイル名を変更することです。
shopt -s globstar nocaseglob
for input in Music/**/*.wav
do
indir=$(dirname "$input")
outdir=${indir/#Music/Music_Flac}
[ ! -d "$outdir" ] && mkdir -p "$outdir"
infile=$(basename "$input")
outfile=${infile%.???}.flac
echo ffmpeg -i "$input" "${outdir}/${outfile}"
done
ファイルが*.wav
と*.WAV
しかない場合は、shopt nocaseglob
をスキップして、代わりにfor input in Music/**/*.wav Music/**/*.WAV
を使用できます。
Ffmpegにどのオプションを使用したいのかわかりませんが、ビルドできる入力および出力ファイルパスのecho
の例を提供しました。
このサンプルディレクトリツリー:
$ tree Music
Music
├── a.wav
├── b.WAV
├── c d.wav
└── subdir1
├── a.wav
├── b.WAV
├── c d.wav
└── subdir2
├── a.wav
├── b.WAV
└── c d.wav
コマンドの出力例は次のとおりです。
ffmpeg -i Music/a.wav Music_Flac/a.flac
ffmpeg -i Music/b.WAV Music_Flac/b.flac
ffmpeg -i Music/c d.wav Music_Flac/c d.flac
ffmpeg -i Music/subdir1/a.wav Music_Flac/subdir1/a.flac
ffmpeg -i Music/subdir1/b.WAV Music_Flac/subdir1/b.flac
ffmpeg -i Music/subdir1/c d.wav Music_Flac/subdir1/c d.flac
ffmpeg -i Music/subdir1/subdir2/a.wav Music_Flac/subdir1/subdir2/a.flac
ffmpeg -i Music/subdir1/subdir2/b.WAV Music_Flac/subdir1/subdir2/b.flac
ffmpeg -i Music/subdir1/subdir2/c d.wav Music_Flac/subdir1/subdir2/c d.flac
...途中で必要なmkdir
コマンドとともに。
質問への正しい答えとして選択した@RomanPerekhrestの回答に加えて、うまく機能するGUIソリューションもあります。
GitHub-dfaust/soundkonverter:soundKonverterはメンテナンスモードです。PRは歓迎されます。
Archリポジトリにもあります: