sed를 사용하여 경로에서 마지막 2개 디렉터리 제거

sed를 사용하여 경로에서 마지막 2개 디렉터리 제거

경로에서 마지막 2개 디렉터리를 어떻게 제거할 수 있나요?

경로 예:

./dir1/dir2/file-example.json

내가 원하는 모습은 다음과 같습니다.

./dir1/

답변1

경로가 가변적이라면 전용 도구를 사용하는 것이 좋습니다.

예를 들면 다음과 같습니다 zsh.

file=./dir1/dir2///file-example.json
parent=$file:h:h

(머리의 머리).

또는 bashGNU 유틸리티를 사용하십시오:

IFS= read -rd '' parent < <(
  dirname -z -- "$file" | xargs -r0 dirname -z --)

이렇게 하면 sed알고리즘을 수동으로 구현해야 하며 dirnameOR 처럼 zsh모든 사례를 잘 처리 하려는 경우 :h복잡할 수 있습니다 . 고려해야 할 사항:

  • 후행 항목은 무시해야 합니다(그러나 입력 파일이 또는 /인 경우 전부는 아님 ).////
  • 두 개 이상의 다른 시퀀스는 일부 시스템에서 특별한 처리가 필요할 수 있는 경우를 제외하고 /단일 시퀀스와 동일하게 처리되어야 합니다 ( 시연하기 위해 위의 예에 추가한 이유를 설명 ).///foo/bar/////
  • 디렉터리 이름은 foo다음과 같아야 합니다..
  • 디렉터리 이름은 /다음과 같아야 합니다./
  • 파일 경로에는 NUL이 아닌 바이트의 시퀀스가 ​​포함될 수 있습니다. 여기에는 유효한 문자를 형성하지 않거나 줄바꿈을 나타내지 않는 바이트 시퀀스가 ​​포함됩니다. 경로는 LINE_MAX보다 길 수 있습니다(일부 sed구현에서는 이보다 긴 줄을 처리하지 않습니다).

sed/locale에서 사용 -z하고 호출하는 한 GNU 구현을 사용하여 이 작업을 수행하는 것이 가능해야 하지만 이는 쉽지 않습니다.CPOSIX

파일의 상위 디렉토리의 상위 디렉토리를 찾으려면 file-example.json다음을 수행할 수 있습니다.

parents=(*/**/file-example.json(ND:h:h))

zsh에서. 또는 bash4.4+ 및 GNU 유틸리티를 사용하십시오.

readarray -td '' parents < <(
  find . -mindepth 2 -name file-example.json -print0 |
    LC_ALL=C gawk -F/ -v RS='\0' -v ORS='\0' '
      {NF -= 2; print}'
)

$parents이러한 디렉터리를 배열로 가져옵니다 .

관련 정보