GNU/Linux >> Linux の 問題 >  >> Linux

パイプ全体でXargsを使用する方法はありませんか?

あるフォルダに移動した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

Linux
  1. Linuxでパイプと名前付きパイプを使用する方法(例付き)

  2. コマンドの使用方法を学ぶためにマニュアルページを使用する方法?

  3. 典型的な使用シナリオのためにマンページを検索する方法は?

  1. 複数のサーバー間でユーザーを管理するための最良の方法は?

  2. UbuntuでWindowsLiveMessengerを使用する方法はありますか?

  3. grep から cp に出力をパイプする方法は?

  1. Linux で grep の検索仕様として使用するパイプ出力

  2. パイプ出力をシェル スクリプトの引数として使用できますか?

  3. systemd で OnFailure を使用する適切な方法