다음 문제가 있습니다.
디렉토리에는 , 및 Example1
3개의 파일이 있습니다 .Example1
Things
Pictures
디렉토리에는 , 및 Example2
3개의 파일이 있습니다 .Example2
Example3
Pictures
디렉토리 이름과 일치하는 파일만 표시하는 목록이 필요합니다. 이는 Example1
및 입니다 Example2
. 나는 diff, find, Locate 및 ls를 사용해 보았지만 아무것도 달성하지 못했습니다.
답변1
역참조를 사용하면 포함 디렉터리와 이름이 같은 파일 이름을 정규식과 쉽게 일치시킬 수 있습니다. what/ever/something/something
두 something
부분이 동일하고 슬래시를 포함하지 않는 형식의 파일 이름입니다 . 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