다음 질문이 있습니다.
디렉토리에는 , 및 Example1
의 세 가지 파일이 포함되어 있습니다 .Example1
Things
Pictures
디렉토리에는 , 및 Example2
의 세 가지 파일이 포함되어 있습니다 .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
내부 결과가 true인 경우 에만 -print
실행됩니다 .[ ... ]
-exec sh -c '...'
산출:
./Example1/Example1
./Example2/Example2