find出力を別のfind呼び出しにパイプする方法

find出力を別のfind呼び出しにパイプする方法

これが私がしたいことです。

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

関連情報