디렉토리 내에서 디렉토리를 찾는 방법은 무엇입니까?

디렉토리 내에서 디렉토리를 찾는 방법은 무엇입니까?

특정 이름을 가진 디렉터리를 어떻게 찾을 수 있습니까? 단, 해당 디렉터리가 특정 이름을 가진 다른 디렉터리 내에 있는 경우에만 가능합니까? 예를 들어 다음과 같은 디렉토리 구조가 있을 때

a
├── b
│   └── e
├── c
│   └── e
└── d

"e" 디렉터리를 찾고 싶지만 해당 디렉터리가 "c"라는 디렉터리에 있는 경우에만 가능합니다. 가능하다면 grep 없이 find 명령만 사용하십시오.

답변1

GNU를 사용하여 전체 경로에서 일치 항목을 검색합니다 find.-path

$ find . -path '*/c/e'
./a/c/e

e이는 이름이 지정된 디렉터리의 모든 파일이나 디렉터리와 일치합니다 c.

find또는 GNU 또는 기타 지원되는 것이 없는 경우 -path다음을 수행할 수 있습니다.

$ find . -type d -name c -exec find {} -name e \;
./a/c/e

여기서의 비결은 먼저 모든 c/디렉터리를 찾은 다음 해당 디렉터리에서 이름이 e.

답변2

Bash에 태그를 지정했으므로 또 다른 접근 방식은 다음을 사용하는 것입니다.글로벌 스타:

shopt -s globstar # Sets globstar if not already set
# Print the matching directories
echo **/c/e/
# Or put all matching directories in an array
dirs=(**/c/e/)

답변3

@terdon의 솔루션 외에도 GNU를 찾을 수 없는 사람들을 위해 여기에 대체 버전을 제공했습니다(그의 아이디어를 따라야 찾을 수 있었습니다!).

find . -type d -name 'c' -exec find '{}/e' -type d \( -name 'e' -ls -o -prune \) \; 2>/dev/null 

이것은 내 컴퓨터에서 작동하는 것 같습니다

테스트하려면:

# add files under each directories as otherwise some solutions would 
# list also files under any "c/e" subdirs ... 
# in a subdir : do  : 
mkdir -p a b c a/b a/c a/c/e a/c/d/e a/c/d/e/c/e/f/g
for i in $(find */ -type d -ls); do ( cd "$i" && touch a b c d e ) ; done 
# this will creates several files under each subdirs, wherever it can (ie, when they don't match a subdir's name).
# then test:
find . -type d -name 'c' -exec find '{}/e' -type d \( -name 'e' -ls -o -prune \) \; 2>/dev/null 
# and it answers only the 2 matching subdirs that match name "c/e":
inode1 0 drwxr-xr-x   1 uid  gid   0 nov.  2 17:57 ./a/c/e
inode2 0 drwxr-xr-x   1 uid  gid   0 nov.  2 18:02 ./a/c/d/e/c/e

답변4

Fd 도구를 사용합니다.

fd -t d --full-path /c/e$

https://github.com/sharkdp/fd

관련 정보