サブディレクトリ内のすべての.wavファイルを.flacに変換するには?

サブディレクトリ内のすべての.wavファイルを.flacに変換するには?

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

答え1

欲しいなら変えるwav私が見つけた最も簡単な方法はバイナリをflac使用することです。flac

find . -name '*.wav' -exec flac --best {} --delete-input-file \;

以下は、コマンドのさまざまな部分の分析です。

  • find .:このコマンドは、現在のディレクトリとすべてのサブディレクトリ(としてマーク).からファイルを検索します。

  • -name '*.wav'.wav:このフラグは、拡張子を持つファイルを探していることを指定します。*はすべての文字または文字グループと一致するワイルドカードなので、このフラグはで始まるすべての項目と一致します.wav

  • -exec:このフラグは、find検索基準に一致するファイルに対してコマンドを実行するようにコマンドに指示します。

  • flac --best {} --delete-input-file:一致するファイルに対して実行されるコマンド。{}コマンドが処理中のファイルのプレースホルダーですfind。このflacコマンドは、フラグで指定された最高の圧縮レベルを使用してファイルをFLAC形式に変換します--best。この--delete-input-fileフラグは、FLAC形式に正常に変換した後に元のファイルを削除するように指示しますflac.wav

  • \;:オプションを正しく機能させるflacには、コマンド終了信号に必要です。-exec

答え2

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 1616- 使用するロギングレベルを設定します。ffmpeg

答え3

別のオプションは、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 nocaseglobfor 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その過程で必要なコマンドもあります。

答え4

質問に対する正しい答えとして選択した@RomanPerekhrestの答えに加えて、非常にうまく機能するGUIソリューションがあります。

soundkonverter、soundKonverterがメンテナンスモードになっています。 PRを歓迎します。 soundkonverter_GitHub_kutuのソースコードをダウンロードしてください。

Archリポジトリにもあります。

Arch Linux - soundkonverter 3.0.1-1 (x86_64)

関連情報