상대 경로를 정규화하는 이식 가능하고 편리한 방법이 있습니까?

상대 경로를 정규화하는 이식 가능하고 편리한 방법이 있습니까?

여기서 "정규화"는 기본적으로 파일 경로를 가장 간단한 또는 "정규" 형식으로 변환하는 프로세스를 의미합니다. 예를 들어, 의 정식 형식 /foo/.//bar/../baz/은 입니다 /foo/baz.

절대 경로의 경우 zsh의 :a수정자는 다음과 같은 작업을 훌륭하게 수행합니다.

% printf -- '%s\n%s\n' "${WILDABSPATH}" "${WILDABSPATH:a}"
/foo/.//bar/../baz/
/foo/baz

안타깝게도 상대 파일 경로의 경우 :a수정자는 파일 경로를 절대 경로로 변환하기 때문에 너무 많은 작업을 수행합니다.

% printf -- '%s\n%s\n' "${WILDRELPATH}" "${WILDRELPATH:a}"
./foo/.//bar/../baz/
/tmp/foo/baz

${WILDRELPATH}마지막 예를 사용하여 로 변환하는 좋은 방법이 있습니까 foo/baz?


내 질문에 대한 대답 중 하나는 다음과 같을 것 같습니다.

[[ ${ORIGINAL} == /* ]] \
  && CANONICAL=${ORIGINAL:a} \
  || CANONICAL=${${ORIGINAL:a}#$PWD/}

더 간단한 게 있나요?

답변1

나는 이 문제가 를 사용하여 해결될 수 있다고 믿는다 realpath.

다음을 수행할 수 있습니다...

realpath -m --relative-to=./ ./foo/.//bar/../baz/ # Outputs foo/baz
# or
realpath -m /foo/.//bar/../baz/ # Outputs /foo/baz

관련 정보