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

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

다음 질문이 있습니다.

디렉토리에는 , 및 Example1의 세 가지 파일이 포함되어 있습니다 .Example1ThingsPictures

디렉토리에는 , 및 Example2의 세 가지 파일이 포함되어 있습니다 .Example2Example3Pictures

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

답변1

역참조를 사용하면 포함된 디렉터리와 동일한 이름을 가진 파일 이름을 정규식으로 쉽게 일치시킬 수 있습니다. 이는 슬래시가 없는 동일한 파일 이름의 what/ever/something/something두 부분입니다. somethingBRE 정규식 구문에서 [^/]*슬래시를 포함하지 않는 문자열을 일치시키고, \(/[^/]*\)슬래시 뒤에 슬래시가 아닌 문자가 오는 모든 문자열을 일치시키고, 전체를 그룹으로 만들고, \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

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

산출:

./Example1/Example1
./Example2/Example2

관련 정보