GNUparallel
は のバリアントですxargs
。どちらも非常によく似たインターフェースを持っていparallel
ますxargs
。
そうは言っても、どちらも操作方法はかなり単純です。デフォルトの動作では、両方のプログラムが STDIN から入力を読み取り、空白に基づいて入力をトークンに分割します。これらの各トークンは、提供されたプログラムに引数として渡されます。xargs のデフォルトでは、できるだけ多くのトークンをプログラムに渡し、制限に達したときに新しいプロセスを開始します。並列のデフォルトがどのように機能するかわかりません。
次に例を示します。
> echo "foo bar \
baz" | xargs echo
foo bar baz
デフォルトの動作にはいくつかの問題があるため、いくつかのバリエーションが見られるのが一般的です。
最初の問題は、トークン化に空白が使用されるため、空白が含まれるファイルがあると、並列および xargs が破損することです。1 つの解決策は、代わりに NULL 文字をトークン化することです。find
これを簡単にするオプションも提供します。
> echo "Success!" > bad\ filename
> find . "bad\ filename" -print0 | xargs -0 cat
Success!
この-print0
オプションはfind
、空白の代わりに NULL 文字でファイルを区切るように指示します。
この-0
オプションはxargs
、NULL 文字を使用して各引数をトークン化するように指示します。
parallel
デフォルトの動作が改行のみをトークン化するという点よりも少し優れていることに注意してくださいxargs
。したがって、デフォルトの動作を変更する必要はほとんどありません。
xargs
もう 1 つの一般的な問題は、引数がまたはに渡される方法を制御したい場合があることですparallel
。プログラムに渡される引数の特定の配置が必要な場合は、 を使用{}
して、引数を配置する場所を指定できます。
> mkdir new_dir
> find -name *.xml | xargs mv {} new_dir
これにより、現在のディレクトリとサブディレクトリ内のすべてのファイルが new_dir ディレクトリに移動されます。実際には次のように分類されます。
> find -name *.xml | xargs echo mv {} new_dir
> mv foo.xml new_dir
> mv bar.xml new_dir
> mv baz.xml new_dir
xargs
そのため、どのように機能するかを考慮parallel
して、コマンドで問題を確認できることを願っています。find . -name '*.xml'
プログラムに渡される xml ファイルのリストを生成しますscript.sh
。
> find . -name '*.xml' | parallel -j2 echo script.sh {}
> script.sh foo.xml
> script.sh bar.xml
> script.sh baz.xml
ただし、ls | parallel -j2 script.sh {}
現在のディレクトリ内のすべてのファイルのリストを生成して、script.sh プログラムに渡します。
> ls | parallel -j2 echo script.sh {}
> script.sh some_directory
> script.sh some_file
> script.sh foo.xml
> ...
バージョンのより正しいバリアントはls
次のようになります。
> ls *.xml | parallel -j2 script.sh {}
ただし、これと find バージョンの重要な違いは、find はファイルのすべてのサブディレクトリを検索するのに対し、ls は現在のディレクトリのみを検索することです。上記のコマンドの同等のfind
バージョンはls
次のようになります。
> find -maxdepth 1 -name '*.xml'
これは、現在のディレクトリのみを検索します。