상대 경로가 주어지면 상대 심볼릭 링크를 만드는 방법은 무엇입니까?

상대 경로가 주어지면 상대 심볼릭 링크를 만드는 방법은 무엇입니까?

프로그래밍 방식으로 상대 경로의 디렉터리 깊이를 찾고 싶습니다. 예를 들어 깊이 test/dir/hello는 3입니다.

더 구체적으로 말하자면, 상위 디렉터리에 있는 파일에 대한 심볼릭 링크를 만들 수 있도록 디렉터리 깊이를 원합니다.

${current_path}다음 과 같은 2개의 매개변수가 있습니다.${parent_file_to_lunk}

${current_path}상대 기호 파일을 생성할 수 있도록 디렉토리 깊이를 어떻게 결정합니까 ${parent_file_to_lunk}?

이와 비슷하지만 ../디렉토리 깊이만큼:

cd ${current_path} ; ln -s ../$parent_file_to_link}

답변1

노력하다

parent_path=$(echo "$current_path"/ | sed -e "s|[^/]||g" -e "s|/|../|g")
cd "${current_path}" ; ln -s "${parent_path}${parent_file_to_link}"

계산에 슬래시만 넣으면 됩니다 "${current_path}". 필요한 깊이는 슬래시 수보다 1이 더 크므로(예를 들어 test/dir/hello슬래시가 2개인 버전의 깊이는 3임) 슬래시 하나만 추가하면 됩니다 echo "$current_path"/. sed슬래시를 조작하고 있으므로 명령의 구분 기호로 다른 문자를 사용하는 것이 더 쉽습니다 / . 저는 파이프( )를 사용하는 것을 좋아합니다 . 슬래시가 아닌 모든 문자를 찾아 null 문자로 바꿉니다. 즉, 슬래시를 제외한 모든 문자를 제거합니다. 그래서 의 값을 로 잘라냈습니다. 그런 다음 각각을 로 변경하면 다음과 같이 됩니다.seds|s|[^/]||g"${current_path}"test/dir/helloechotest/dir/hello////s|/|../|g"/../../../../

참고: 이는 "${current_path}" 중복된(불필요한) 슬래시가 없다고 가정합니다. 예를 들어, test/dir//hello및 는 test/dir/hello/ 논리적으로 동일 test/dir/hello하지만 오해의 소지가 있는 수의 슬래시 문자가 포함되어 있어 프로세스가 중단됩니다.

추신: 인용하지 않을 이유가 없고 자신이 무엇을 하고 있는지 확실히 알고 있지 않는 한 항상 모든 쉘 변수를 인용하십시오. 중괄호(예: )를 사용하는 것은 인용과 동일하지 않습니다.${variable_name}

답변2

이와 같은 것이 작동해야합니다

file="/var/log/dmesg"
ln -s $file $(dirname $file)/../

답변3

하나를 만들고 싶다고 가정해 보겠습니다.

/home/kostas/test/dir/hello/link -> /home/kostas/file/to/link

심볼릭 링크( /home/kostas현재 디렉토리를 가정), 그러나 상대 링크 사용, 즉:

/home/kostas/test/dir/hello/link -> ../../../file/to/link

그런 다음 다음을 수행할 수 있습니다(GNU 사용 ln).

$ current_path=test/dir/hello
$ parent_file_to_lunk=file/to/link
$ ln -rsvt "$current_path/" "$parent_file_to_lunk"
‘test/dir/hello/link’ -> ‘../../../file/to/link’

GNU는 없지만 GNU 또는 ln다음이 있습니다 .bash -O extglobzsh -o kshglobksh93

$ ln -s "${current_path//+([^\/])/..}/$parent_file_to_lunk" "$current_path/"

(여기서 가정하는 구성 요소는 $current_path심볼릭 링크 자체가 아닙니다.)

관련 정보