我想以编程方式查找相对路径的目录深度。例如深度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
.由于我们正在操作斜杠,因此使用其他字符作为命令的分隔符会更/
容易;我喜欢使用竖线 ( )。 查找所有非斜杠字符并将其替换为空字符。换句话说,它删除除斜杠之外的所有字符。因此,对于的值,我们将其削减为。然后将每个更改为,因此我们最终得到。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
,但它们包含误导性数量的斜杠字符,这会破坏此过程。
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 extglob
或zsh -o kshglob
或ksh93
:
$ ln -s "${current_path//+([^\/])/..}/$parent_file_to_lunk" "$current_path/"
(请注意,它假设 的组件$current_path
本身不是符号链接)