如何在给定相对路径的情况下创建相对符号链接?

如何在给定相对路径的情况下创建相对符号链接?

我想以编程方式查找相对路径的目录深度。例如深度test/dir/hello是 3

更具体地说,我想要目录深度,以便我可以创建指向位于父目录的文件的符号链接。

我有以下 2 个参数:${current_path}${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包含两个斜杠的 的深度为 3),因此我们只需添加一个斜杠:echo "$current_path"/。将其输送到sed.由于我们正在操作斜杠,因此使用其他字符作为命令的分隔符会更/ 容易;我喜欢使用竖线 ( )。  查找所有非斜杠字符并将其替换为空字符。换句话说,它删除除斜杠之外的所有字符。因此,对于的值,我们将其削减为。然后将每个更改为,因此我们最终得到。seds|s|[^/]||g"${current_path}"test/dir/helloechotest/dir/hello////s|/|../|g"/../../../../

注意:这假设"${current_path}" 其中没有任何多余的(不必要的)斜杠。例如,test/dir//hellotest/dir/hello/ 在逻辑上等同于test/dir/hello,但它们包含误导性数量的斜杠字符,这会破坏此过程。

PS 始终引用所有 shell 变量,除非您有理由不这样做并且您确定您知道自己在做什么。使用大括号(如)并不等同于引用。${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 ln,但有 GNUbash -O extglobzsh -o kshglobksh93

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

(请注意,它假设 的组件$current_path本身不是符号链接)

相关内容