특정 이름을 가진 상위 디렉토리의 경로를 찾는 방법은 무엇입니까? 예를 들어, 디렉토리가 있고 반환하려는 /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 를 사용할 수 있습니다 #
)##