주어진 이름을 가진 조상 디렉토리를 찾는 방법은 무엇입니까?

주어진 이름을 가진 조상 디렉토리를 찾는 방법은 무엇입니까?

특정 이름을 가진 상위 디렉토리의 경로를 찾는 방법은 무엇입니까? 예를 들어, 디렉토리가 있고 반환하려는 /a/b/c/d/e/f/g이름을 가진 상위 디렉토리를 찾고 싶다고 가정해 보겠습니다 .c/a/b/c

사용 사례는 상당히 중첩된 디렉터리 구조에 있고 읽기 어려운 문자열을 갖고 싶지 않으며 ../../..디렉터리의 중첩 수준을 업데이트할 때 다음 사항도 확인해야 한다는 것입니다. 향후 디렉토리 구조에서 해당 문자열을 변경하십시오.

파괴적이지는 않지만 특정 이름을 가진 두 개의 상위 디렉터리가 있는 경우 이상적으로는 경로가 가장 긴 디렉터리를 원합니다. 즉 , 이상적으로는 대신 /a/b/c/d/e/c/f/g반환되어야 합니다 ./a/b/c/d/e/c/a/b/c

답변1

해결책은 매개변수 대체를 두 번 사용하는 것입니다.

먼저 디렉터리의 경로 이름을 변수에 저장합니다(현재 작업 디렉터리를 처리하는 경우 이 단계를 건너뛰고 PWD나중에 사용할 수 있습니다 p).

$ p=/a/b/c/d/e/c/f/g

*/c/그런 다음 일치하는 가장 긴 접두사 문자열을 제거할 수 있습니다.

$ echo "${p##*/c/}"
f/g

그러면 우리는 이 결과가$p, 우리는 우리가 원하는 결과를 얻을 것입니다 :

$ echo "${p%${p##*/c/}}"
/a/b/c/d/e/c/

/또는 마지막 항목도 제거하십시오.

$ echo "${p%/${p##*/c/}}"
/a/b/c/d/e/c

이것표준 매개변수 대체 ${variable##pattern}${variable%pattern}가장 긴 일치 접두사 문자열과 가장 짧은 일치 접미사 문자열을 각각 제거합니다 .

/a/b/c( 원하지 않는 것을 얻으려면 "내부" 대체에 of 를 사용할 수 있습니다 #)##

관련 정보