디렉터리와 이름이 같은 파일 찾기

디렉터리와 이름이 같은 파일 찾기

다음 문제가 있습니다.

디렉토리에는 , 및 Example13개의 파일이 있습니다 .Example1ThingsPictures

디렉토리에는 , 및 Example23개의 파일이 있습니다 .Example2Example3Pictures

디렉토리 이름과 일치하는 파일만 표시하는 목록이 필요합니다. 이는 Example1및 입니다 Example2. 나는 diff, find, Locate 및 ls를 사용해 보았지만 아무것도 달성하지 못했습니다.

답변1

역참조를 사용하면 포함 디렉터리와 이름이 같은 파일 이름을 정규식과 쉽게 일치시킬 수 있습니다. what/ever/something/somethingsomething부분이 동일하고 슬래시를 포함하지 않는 형식의 파일 이름입니다 . BRE 정규식 구문에서는 [^/]*슬래시를 포함하지 않는 모든 문자열과 일치하고 \(/[^/]*\)슬래시 뒤에 슬래시가 아닌 문자가 여러 개 오는 것과 일치하며 전체를 그룹으로 만들고 \1첫 번째 그룹과 일치하는 동일한 텍스트와 일치합니다. \(/[^/]*\)\1동일한 이름을 가진 두 개의 경로 세그먼트를 일치시킵니다. .*이전 디렉터리 구성 요소와 일치하도록 시작 부분에 추가합니다 .

GNU 찾기, FreeBSD 찾기, macOS 찾기 또는 다음을 find지원하는 기타 항목을 사용합니다 -regex.

find . -regex '.*\(/[^/]*\)\1'

답변2

일반적으로 파일보다 디렉터리 수가 적으므로 모든 디렉터리를 찾은 다음 필요한 파일 이름이 포함되어 있는지 테스트해 보겠습니다.

find . -type d -exec sh -c '
    for dirpath do
        filepath="$dirpath/${dirpath##*/}"
        [ -f "$filepath" ] && printf "%s\n" "$filepath"
    done' sh {} +

그러면 파일과 이름이 같은 디렉터리에 있는 모든 일반 파일(및 일반 파일에 대한 심볼릭 링크)의 경로 이름이 인쇄됩니다.

sh -c테스트는 여러 디렉터리 경로 이름을 인수로 가져오는 짧은 인라인 스크립트에서 수행됩니다 . 각 디렉터리 경로 이름을 반복하고 우리가 찾고 있는 이름으로 파일 경로 이름을 구성합니다. ${dirpath##*/}코드의 는 로 대체될 수 있습니다 $(basename "$dirpath").

주어진 예제 디렉토리 구조의 경우 다음이 출력됩니다.

./Example1/Example1
./Example2/Example2

그냥 테스트하려면어떤 이름, 일반 파일뿐만 아니라 -f테스트를 테스트로 변경하세요 -e.

답변3

사용 find -exec:

find . -type f \
  -exec sh -c '[ "$(basename "$1")" = "$(basename "$(dirname "$1")")" ]' find-sh {} \; \
  -print

내부 -print결과 가 참인 경우에만 실행 됩니다 .[ ... ]-exec sh -c '...'

산출:

./Example1/Example1
./Example2/Example2

관련 정보