디렉터리에서 파일 이름을 반복적으로 검색하고, 발견되면 내림차순으로 중지합니다.

디렉터리에서 파일 이름을 반복적으로 검색하고, 발견되면 내림차순으로 중지합니다.

동일한 이름의 파일이 포함된 디렉토리 트리가 있습니다. 예를 들면 다음과 같습니다.

a/file
a/...
a/b/file
x/a/file
x/a/...
x/b/file

나는 트리를 재귀적으로 검색할 때 먼저 오는 모든 경로를 얻기 위해 find(with -exec및 ) 를 사용하려고 합니다 . 내 예는 다음을 반환합니다.-prunefile

a/file
x/a/file
x/b/file

a/b/file호출되는 파일이 file이미 에 있기 때문에 반환되지 않습니다 a/.

Bash를 사용하여 이를 어떻게 달성할 수 있나요?

답변1

find . -type d -exec sh -c '
   f="$1"/file
   [ -e "$f" ] && { printf "%s\n" "$f"; true; }
' find-sh {} \; -prune

file파일을 찾는 대신 디렉터리를 찾아 각 디렉터리에 존재하는지 테스트했습니다. file존재하는 경우 해당 경로를 인쇄하고 -prune해당 디렉토리에 대해 활성화하십시오.

노트:

  • true-pruneprintf어떤 이유로 실패 하더라도 해당 작업을 수행하는 것이 보장됩니다.

  • 이 솔루션에서는 find아무 것도 처리되지 않습니다 file. 디렉터리만 처리됩니다. 로 무엇인가를 하고 싶다면 file내부 쉘에서 으로 할 수 있습니다 $f.

    예: 를 사용하면 … -prune -print도구는 파일이 아닌 관련 디렉터리 경로 이름을 인쇄합니다. 내부 쉘에서 사용하는 file경로 를 인쇄합니다 .printf

관련 정보