두 개의 연속된 find 명령을 연결하는 것이 가능합니까?

두 개의 연속된 find 명령을 연결하는 것이 가능합니까?

나는 원해요:

  • 대문자로 시작하는 모든 디렉토리 찾기
  • 그런 다음 이 디렉터리 내에서 ".git"이라는 이름의 모든 디렉터리를 찾습니다.

이는 성능 최적화를 위한 것입니다. 내 해결책은 먼저 검색 범위를 특정 디렉터리로 좁힌 다음 그 안에서 검색하는 것이었습니다.

우선 제 생각은 이렇습니다.

find / -mindepth 1 -maxdepth 1 -name "[[:upper:]]*"

두 번째로 사용하는 것은 다음과 같습니다.

find / -type d -name ".git" 2>/dev/null

이제 나는 그것들을 어떻게 연결해야 할지 모르겠습니다. 두 번째 항목은 find첫 번째 항목의 결과만 검색하기를 원합니다 find.

또는 XY 문제인 경우 속도 개선을 위한 제안 사항을 알려주세요.

.git머신의 모든 디렉토리를 찾아야 합니다 . 그러나 디렉터리는 .git대문자로 시작하는 최상위 디렉터리에 있어야 합니다.

답변1

find여기에서는 다음을 사용하여 표현식을 사용하거나 -mindepth/ GNUism을 피할 수도 있습니다 -maxdepth.

find / ! -path / ! -path '/[[:upper:]]*' -prune -o -name .git -type d -print

보다 일반적으로 다음 find을 통해 이식 가능한 명령을 연결할 수 있습니다.

find ... -exec sh -c '
  find "$@" ... -exec ... {\} ...' sh {} +

{}(이는 외부(첫 번째) 조회에서 선택되지 않도록 내부(두 번째) 조회에 를 삽입하는 방법을 보여줍니다 .

또는 최신 버전의 GNU find(4.9.0 이상)를 사용하세요.

find ... -print0 | find -files0-from - ...

답변2

첫 번째는 find단일 레벨만 검색하므로 이를 간단한 쉘 와일드카드 패턴으로 바꿀 수 있습니다: . 그런 다음 이를 검색 위치로 사용합니다 /[[:upper:]]*.find

find /[[:upper:]]* -type d -name ".git" 2>/dev/null

관련 정보