Linux 쉘에서 두 개의 절대 경로에서 상대 경로를 계산하는 방법은 무엇입니까? 있습니다. 첫 번째는 디렉토리이고, 두 번째는 디렉토리

우리는 두 가지 경로가 있습니다. 첫 번째는 디렉토리이고, 두 번째는 디렉토리 또는 파일입니다.

/a/b/c/a/d/e.txt

첫 번째 경로에서 두 번째 경로로의 상대 경로는 다음과 같습니다.

../../d/e.txt

리눅스 터미널에서 어떻게 계산합니까? “사용 사례는 무엇입니까?”



답변

GNU coreutils 가정 :

  • 심볼릭 링크의 경우 ln최근에 --relative옵션을 배웠습니다 .

  • 다른 모든 경우 realpath에는 옵션 --relative-to=및을 지원합니다 --relative-base=.


답변

나에게, 대답 (파이썬 oneliner를 사용하는)은 완벽하게 작동합니다.

$ python -c "import os.path; print os.path.relpath('/a/d/e.txt', '/a/b/c')"
../../d/e.txt

Mac OSX에서 Linux (Kubuntu 14.04)에서 성공적으로 테스트되었으므로 Python 2.6이 필요합니다.


답변

realpath그것에 의존 하지 않고 지속적으로 사용할 수 없으며 종속성을 최소화하기 위해이 답변을 약간 얻었습니다 .

function relative_path_from_to() {
  # strip trailing slashes
  path1=${1%\/}
  path2=${2%\/}
  # common part of both paths
  common=$(printf '%s\x0%s' "${path1}" "${path2}" | sed 's/\(.*\).*\x0\1.*/\1/')
  # how many directories we have to go up to the common part
  up=$(grep -o "/" <<< ${path1#$common} | wc -l)
  # create a prefix in the form of ../../ ...
  prefix=""; for ((i=0; i<=$up; i++)); do prefix="$prefix../"; done
  # return prefix plus second path without common
  printf "$prefix${2#$common}"
}

두 경로의 공통 부분을 찾기 위해 서브 쉘을 생성합니다. 어쩌면 당신이 그것을 좋아-나를 위해 작동합니다.


답변