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첫 번째 조회에 추가된 내용을 확인하세요 . 이를 포함하지 않으면 현재 디렉터리( .)도 조회 결과 중 하나로 전달되어 이중 결과를 얻게 됩니다.

$ 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

관련 정보