web-dev-qa-db-ja.com

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

フォルダーに移動した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を置き換えるか、何らかの方法で両方のコマンドがアクセスできる変数または何かにxargsを送信します。名前付きパイプとそのジャズをいじってみましたが、2つのコマンドの間にパイプされている実際のデータがあるという事実は、私の頭上にあります。

15
sagev9000

私が正しく理解している場合、各入力行に対して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 - "/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を付加し、.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 - "/media/1tb/$dir/${file#.*}.mp3"
done

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

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;
3
goldilocks