これが私がしたいことです。
find . -maxdepth 1 -type d -print0 | xargs -0 -P4 find -name 'war' -type d
null で終わるディレクトリ名のリストを作成し、このリストを xargs に渡そうとします。 xargsは、各ディレクトリ名に対して4つのプロセスプールを使用してfindを呼び出します。
私の質問は:パイプ検索コマンドから標準入力にどのようにアクセスしますか?それはまるで
find <STDIN> -name 'war' -type d
答え1
Findは標準入力からパスを読み取ることができず、-
他の多くのプログラムのように指定することはできません。
並行して実行するには、GNU Parallelを使用することをお勧めします。
find . -mindepth 1 -maxdepth 1 -type d -print0 | parallel -0 --jobs 4 \
find {} -name "war" -type d
-mindepth 1
最初の検索に追加された内容を確認してください。これを含めないと、現在のディレクトリ(.
)もクエリ結果の1つに渡され、デュアル結果が得られます。
$ mkdir a b c d e
$ mkdir b/war c/war
$ find . -mindepth 1 -maxdepth 1 -type d -print0 | parallel -0 --jobs 4 \
find {} -name "war" -type d
./b/war
./c/war
$ find . -maxdepth 1 -type d -print0 | parallel -0 --jobs 4 \
find {} -name "war" -type d
./c/war
./b/war
./c/war
./b/war
答え2
これを使用してください:
find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} -P4 find "{}" -name "war" -type d
.
より良いアプローチはパスを除外することです。
find . -maxdepth 1 -not -path . -type d -print0 |
xargs -0 -I "{}" find "{}" -name "war" -type d