あるフォルダに移動したflacファイルを別のフォルダのmp3に自動的に変換しようとしています。
私の現在のコード行は次のとおりです:
inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test | xargs -I x flac -cd x - | lame -b 320 - //eadn-wc01-5196795.nxedge.io/media/1tb/x.mp3
これがこれまでどのように機能するかを説明するために、inotifywaitは、そこに移動されたファイルを再帰的に監視し、パスとファイル名をパイプに出力します。 xargsはその名前を取り、適切なflacコマンドを作成し、xをファイル名に置き換え、ファイルを別のパイプにデコードします。新しいパイプでは、lameは/mediaの下でflacの出力をmp3に処理します。 xargsが何らかの方法でパイプを越えて到達するか、lameコマンドのxを置き換えるか、または何らかの方法で両方のコマンドがアクセスできる変数などに送信するようにします。名前付きパイプとそのジャズをいじってみましたが、2つのコマンドの間に実際のデータがパイプされているという事実が、頭を悩ませています。
承認された回答:
私が正しく理解していれば、1つのインスタンスflac … | lame …
入力行ごとに、入力を両方のコマンドの引数に補間します。
xargs
が必要なので パイプラインを開始するには、パイプラインを作成できるプログラム、つまりシェルを開始させる必要があります。
inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
xargs -l sh -c 'flac -cd "$0" - | lame -b 320 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$0.mp3"'
または、呼び出し元のシェルに1行ずつ読み取り、パイプラインを実行させます。
inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
while IFS= read -r file; do
flac -cd "$file" - | lame -b 320 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$file.mp3"
done
%w%f
の形式に注意してください /media/1tb
の前に追加する絶対パスを生成します .mp3
を追加します 。 lame
内のファイルのディレクトリ部分を削除する場合 コマンド、$file
を変更します ${file##*/}
へ 。拡張子を削除したい場合は、$file
を変更してください ${file%.*}
へ 。両方を実行する場合は、2つのステップで実行する必要があります。 /media/1tb
の下のディレクトリ階層を再現する場合 、mkdir -p
を使用できます 。
cd ~/test
inotifywait -m -r -q -e moved_to --format "%w%f" . |
while IFS= read -r file; do
[ -f "$file" ] || continue; # skip directories and other special files
dir=${file%/*}; file=${file##*/}
mkdir -p "/media/1tb/$dir"
flac -cd "$dir/$file" - | lame -b 320 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$dir/${file#.*}.mp3"
done