パイプでxargsを使用する方法はありますか?


15

フォルダーに移動したflacファイルを別のフォルダーのmp3に自動的に変換しようとしています。

私の現在のコード行はこれです:

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test |  xargs -I x flac -cd x - | lame -b 320 - /media/1tb/x.mp3

これまでの動作を説明するために、inotifywaitは、そこに移動したファイルを〜/ testで再帰的に監視し、パスとファイル名をパイプに出力します。xargsはその名前を使用して適切なflacコマンドを作成し、xをファイル名に置き換え、ファイルを別のパイプにデコードします。新しいパイプでは、lameはflacの出力を/ mediaの下のmp3に処理します。xargsにパイプを介して何らかの方法で到達して、lameコマンドのxを置き換えるか、何らかの方法で両方のコマンドがアクセスできる変数に送信するか、何かが欲しい。名前付きパイプとそのジャズをいじってみましたが、2つのコマンド間でパイプ処理される実際のデータがあるという事実に頭を悩ませています。

回答:


16

正しく理解できれば、flac … | lame …入力行ごとに1つのインスタンスを起動し、両方のコマンドの引数に入力を補間する必要があります。

xargsパイプラインを開始する必要があるため、パイプラインを作成できるプログラム、つまりシェルを開始する必要があります。

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
xargs -l sh -c 'flac -cd "$0" - | lame -b 320 - "/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 - "/media/1tb/$file.mp3"
done

形式ことに注意してください%w%fあなたが先頭に追加している先の絶対パス、生産/media/1tbおよび追加を.mp3lameコマンドでファイルのディレクトリ部分を削除する場合は、に変更$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 - "/media/1tb/$dir/${file#.*}.mp3"
done

3

あなたは次のようなものを試すことができます:

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test \
    | while read x; do \
        flac -cd "$x" - | lame -b 320 - "/media/1tb/$x.mp3"
    done;

1
while read …解決策ですが、ドロップしxargsます。あなたが書いたものは意味をなさない。どこからxargsそのインプットを得ていると思う?また、適切に引用する必要があります。音楽ファイル名にはスペースが含まれているのが一般的です。
ジル 'SO-悪であるのをやめる'

それは/ OPは、私は「あなたが試みることができると述べた理由である、やっているまさに私には明確ではないではなかった@Gilles のようなものなどと「xargsのビットはあなたの意図に忠実であるならば、私はよく分からない」と」 。だから、最良の答えではなく、正しい方向へのヒントだと思う。引用の問題を修正し、xargsを削除しました。
goldilocks
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.