프로그래밍 방식으로 상대 경로의 디렉터리 깊이를 찾고 싶습니다. 예를 들어 깊이 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 문자로 바꿉니다. 즉, 슬래시를 제외한 모든 문자를 제거합니다. 그래서 의 값을 로 잘라냈습니다. 그런 다음 각각을 로 변경하면 다음과 같이 됩니다.sed
s
|
s|[^/]||g
"${current_path}"
test/dir/hello
echo
test/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 extglob
zsh -o kshglob
ksh93
$ ln -s "${current_path//+([^\/])/..}/$parent_file_to_lunk" "$current_path/"
(여기서 가정하는 구성 요소는 $current_path
심볼릭 링크 자체가 아닙니다.)