6

本 Linux 101 Hacks の 38 ページでは、次のように提案されています。

cat url-list.txt | xargs wget –c

私は通常、次のことを行います。

for i in `cat url-list.txt`
   do
      wget -c $i
   done 

長さ以外に、xargs-technique が bash の古い for-loop-technique よりも優れている点はありますか?

追加した

C ソース コードにはフォークが 1 つしかないようです。対照的に、bash-combo にはいくつのフォークがありますか? この問題について詳しく教えてください。

4

7 に答える 7

4

xargs を使用すると、巨大なリストを作成することもできます。これは、シェルが長さに制限のあるコマンド ラインを使用するため、「for」バージョンでは不可能です。

于 2009-08-15T23:35:19.133 に答える
4

次の点も考慮してください。

xargs -I'{}' wget -c '{}' < url-list.txt

しかし、wget は同じことに対してさらに優れた手段を提供します。

wget -c -i url-list.txt

xargs とループの考慮事項に関しては、意味と実装が比較的「単純」で「明確」な場合は xargs を好み、それ以外の場合はループを使用します。

于 2009-08-15T21:51:37.093 に答える
4

xargsフォークするプロセスごとに複数の入力を処理するように設計されています。入力をループするシェル スクリプトは、for入力ごとに新しいプロセスをフォークする必要があります。プロセスごとのオーバーヘッドを回避することで、xargsソリューションのパフォーマンスを大幅に向上させることができます。

于 2009-08-15T19:59:25.823 に答える
4

の UNIX マンページxargsの「根拠」セクションから。(興味深いことに、このセクションは OS X BSD バージョンのxargsにも GNU バージョンにもありません。)

xargs ユーティリティの従来のアプリケーションは、find ユーティリティと組み合わせて、find -exec の組み合わせを単純に使用することによって起動されるプロセスの数を減らします。xargs ユーティリティは、プロセスの起動に必要なメモリの上限を強制するためにも使用されます。この基準を念頭に置いて、この巻の POSIX.1-2008 では必要最小限の機能のみを選択しました。

フォローアップでは、他のバージョンにフォークがいくつあるか尋ねます。ジムはすでにこれに答えました:反復ごとに1つ。繰り返しは何回ありますか?正確な数を示すことは不可能ですが、一般的な質問には簡単に答えられます。url-list.txt ファイルには何行ありますか?

他にもいくつかの考慮事項があります。xargsスペースやその他の禁止文字を含むファイル名には特別な注意が必要であり、処理をバッチにグループ化-execするオプション ( ) があります。+したがって、すべての人が を好むわけではなくxargs、すべての状況に適しているわけではありません。

次のリンクを参照してください。

于 2009-08-15T21:01:40.020 に答える
2

GNU/Parallel の代わりに、xargs のビルトイン並列処理を使用することを好みます。-P を追加して、並行して実行するフォークの数を示します。のように...

 seq 1 10 | xargs -n 1 -P 3 echo

計算には 3 つの異なるコアで 3 つのフォークを使用します。これは最新の GNU Xargs でサポートされています。BSD または Solaris を使用している場合は、自分で確認する必要があります。

于 2011-06-14T15:03:30.197 に答える
1

インターネット接続によっては、GNUParallelhttp ://www.gnu.org/software/parallel/を使用して並列実行することをお勧めします。

cat url-list.txt | parallel wget -c
于 2010-06-10T18:15:28.827 に答える
0

私が考えることができる利点の 1 つは、多くのファイルがある場合、新しいプロセスの開始によるオーバーヘッドがそれほど多くないため、わずかに高速になる可能性があることです。

ただし、私は実際には bash の専門家ではないので、bash の方が優れている (または劣っている) 他の理由がある可能性があります。

于 2009-08-15T19:54:54.960 に答える