私は見た'find -exec cmd {} +'が '{} +'で終わるのはなぜですか?これは(*)の末尾にある{} +
理由を説明します。さて、GNUが入力引数ごとに1つのコマンドに戻る理由は何ですか-exec cmd
?xargs
-I
-i
-I は -str[...] に代わって -x と -L 1 を意味します。
たとえば、
$ seq 1 10 | xargs echo
1 2 3 4 5 6 7 8 9 10
$ seq 1 10 | xargs -I {} echo {}
1
2
3
4
5
6
7
8
9
10
xargs のマニュアルページの BUGS セクションでは、次のように簡単に説明します。
-Lオプションは-Iオプションと互換性がありませんが、互換性はありません。
そして
-I オプションを使用すると、入力から読み取られた各行が内部的にバッファリングされます。これは、-I オプションと一緒に使用すると xargs が受け入れる入力行の長さに上限があることを意味します。この制限を回避するには、-s オプションを使用して xargs で使用されるバッファ領域の量を増やすことができ、xargs への追加呼び出しを使用して非常に長い行が発生しないようにすることもできます。
理由も説明しません。
使用する主な理由の1つxargs
は、実行されるコマンドの数を減らすことです(cp
それぞれ1000個のソースファイル名を実行するか、1個のソースファイル名を使用するよりも1つを実行するか、1000個のソースファイル名を使用する方が良いです。mv
)。 UNIXコマンドでは、ソース(ファイルリストなど)をターゲット(ディレクトリなど)の前に置く必要があります。cp
mv
では、なぜxargs
そのような制限があるのでしょうか?
アップロード日: 2015-11-05
私は最近freebsd 10.0 VMを作成し、freebsdバージョンにこの問題を処理するオプションがxargs
あることがわかりました。-J
-J 回答者
このオプションを指定すると、xargsはそのデータを他のすべての引数に追加するのではなく、最初のreplstrの発生を標準入力から読み取ったデータに置き換えます。このオプションは、入力から読み取られた引数の数(-n)またはxargsによって生成されるコマンドのサイズ(-s)には影響しません。このオプションは、実行されたコマンドでそのパラメータが配置される場所を単に移動します。 replstrはxargsの別々の引数として現れるはずです。たとえば、引用符付き文字列の途中にあると認識されません。また、最初に表示されるreplstrのみが置き換えられます。たとえば、次のコマンドは、現在のディレクトリから大文字で始まるファイルとディレクトリのリストをdestdirにコピーします。
/bin/ls -1d [A-Z]* | xargs -J % cp -Rp % destdir
(*)本質的に「POSIX仕様にそのように出ているからです」。私が見るには、彼らは{}
どこにでも現れる可能性のある解決策を見つけるためにもっと一生懸命努力-exec ... +
する-t
必要があるかもしれません。
ベストアンサー1
(これは質問に対する回答ではないのでコメントでなければなりませんが、長すぎるためコメントとして扱ってください。)
FreeBSD xargsの代わりに、これらの制限のないGNU Parallelを使用できます。繰り返しのコンテキストもサポートします。
seq 10 | parallel -Xj1 echo con{}text
seq 10 | parallel -mj1 echo con{}text
GNU Parallelは、同じコンピュータまたはSSHを介してアクセスできる複数のコンピュータでタスクを並列に簡単に実行できる汎用の並列ハンドラです。多くの場合for
、ループを置き換えることができます。
4つのCPUで32の異なるジョブを実行する場合は、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。
代わりに、GNU Parallel はタスクが完了すると新しいプロセスを作成し、CPU をアクティブに保つことで時間を節約します。
インストールする
ディストリビューションにGNU Parallelがパッケージされていない場合は、rootアクセスなしでプライベートインストールを実行できます。これは10秒で完了できます。
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
その他のインストールオプションについては、以下を参照してください。http://git.savannah.gnu.org/cgit/parallel.git/tree/README
詳細
より多くの例を見る:http://www.gnu.org/software/parallel/man.html
紹介ビデオを見る:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
このチュートリアルを見てください。http://www.gnu.org/software/parallel/parallel_tutorial.html
サポートを受けるには、メールリストに参加してください。https://lists.gnu.org/mailman/listinfo/parallel