1. ホーム
  2. linux

複数の引数を持つxargs

2023-08-13 05:46:41

質問

ソース入力があります。 input.txt

a.txt
b.txt
c.txt

これらの入力を以下のようにプログラムに反映させたいと思います。

my-program --file=a.txt --file=b.txt --file=c.txt

ということで、試しに xargs を使ってみましたが、うまくいきません。

cat input.txt | xargs -i echo "my-program --file"{}

これは

my-program --file=a.txt
my-program --file=b.txt
my-program --file=c.txt

しかし、私は

my-program --file=a.txt --file=b.txt --file=c.txt

何か思い当たることは?

どのように解決するのですか?

これまで紹介したどの解決策も、スペースを含むファイル名を正しく処理することはできません。ファイル名に ' や " が含まれていると、失敗するものさえあります。入力ファイルがユーザーによって生成される場合、驚くようなファイル名に対して準備する必要があります。

GNU パラレル はこれらのファイル名をうまく処理し、(少なくとも)3つの異なる解決策を与えてくれます。もしあなたのプログラムが 3 つの引数を取り、3 つしか引数を取らないのであれば、これは動作するでしょう。

(echo a1.txt; echo b1.txt; echo c1.txt;
 echo a2.txt; echo b2.txt; echo c2.txt;) |
parallel -N 3 my-program --file={1} --file={2} --file={3}

または

(echo a1.txt; echo b1.txt; echo c1.txt;
 echo a2.txt; echo b2.txt; echo c2.txt;) |
parallel -X -N 3 my-program --file={}

しかし、あなたのプログラムがコマンドラインに収まるだけの引数を取る場合。

(echo a1.txt; echo b1.txt; echo c1.txt;
 echo d1.txt; echo e1.txt; echo f1.txt;) |
parallel -X my-program --file={}

イントロビデオで詳細をご覧ください。 http://www.youtube.com/watch?v=OpaiGYxkSuQ