web-dev-qa-db-ja.com

Xargs`-J`オプション

このサイトxargsコマンドに-Jオプションは、コマンド引数で標準入力を目的の位置に渡すことができるようにします。

find . -name '*.ext' -print0 | xargs -J % -0 rsync -aP % user@Host:dir/

しかし GNU xargsのマニュアルページ ではこのオプションは存在しません。

これを受け入れるコマンドの場合、これを行う方法はどれですか?

3
Brethlosze

これがあなたが期待していたものかどうかはわかりませんが、BSDの世界(macOSなど)では-Iおよび-Jコマンドに複数の「行」を渡す方法が異なります。例:

$ ls
file1 file2 file3

$ find . -type f -print0 | xargs -I % rm %
rm file1
rm file2
rm file3

$ find . -type f -print0 | xargs -J % rm %
rm file1 file2 file3

だから-I、xargsは、渡された各要素に対して個別にコマンドを実行します。 -J、xargsはコマンドを1回実行し、すべての要素を連結して、それらをすべて引数として渡します。

rmmkdirなどの一部のコマンドは、複数の引数を取り、単一の引数を渡して複数回実行した場合と同じように機能します。ただし、一部のアプリは、引数を渡す方法によって変更される場合があります。たとえば、tar。 tarファイルを作成してからファイルを追加することも、すべてのファイルを一度に追加してtarファイルを作成することもできます。

$ find . -iname "*.txt" -or -iname "*.pdf" -print0 | xargs -0 -J % tar cjvf documents.tar.bz2 %
4
AndreG

これがBSDバージョンのxargs-Jフラグである場合、GNU xargsに完全に同等のオプションがあるとは思いません。-Jは、replstr(例:%)の1回の出現を、標準入力を介して入力される各行に置き換えます。GNUバージョンには- similarオプション、ただし:-I。ただし、そのフラグでreplstrを複数回使用できます。

あなたの例のような単純なユースケースでは、ドロップインの代わりにGNU xargs -Iを使用できるはずです...

find . -name '*.ext' -print0 | xargs -I % -0 rsync -aP % user@Host:dir/

(さらに紛らわしいのは、BSDバージョンにも-Iがあり、機能が-JとGNU -I)の両方に似ていることです!しかし、これは-Iは他のフラグの影響を受けており、おそらくあなたが探しているものではありません。)

1
B Layer