여기서 "정규화"는 기본적으로 파일 경로를 가장 간단한 또는 "정규" 형식으로 변환하는 프로세스를 의미합니다. 예를 들어, 의 정식 형식 /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