繁体   English   中英

如何在不更改目录的情况下创建相对符号链接?

[英]How to create a relative symlink without changing directory?

我有目录factory ,在其中我有 app dir app_1_2_3_4 我想在factory下为app -> app_1_2_3_4/home/user/ dir 创建一个符号链接,而不使用os.chdir() ,就像这样。 不希望链接中的完整路径。

user@ubuntu % ls -l factory/
total 0
lrwxrwxrwx@  1 user  user   13 Mar 15 04:27 app -> app_1_2_3_4
drwxrwxr-x@ 18 user  user  576 Mar 18 17:09 app_1_2_3_4

我在 python 中试过这个

import os

app_dir_path = '/home/user/factory' + '/' + 'app'
app_dir_ver_path = '/home/user/factory' + '/../' + 'app' + '_{}_{}_{}_{}'.format(major, minor, bugfix, build)
os.symlink(app_dir_ver_path, app_dir_path)

但是这个创建带有完整路径的符号链接

user@ubuntu % ls -l factory/
total 0
lrwxrwxrwx@  1 user  user   13 Mar 15 04:27 app -> /home/user/factory/app_1_2_3_4
drwxrwxr-x@ 18 user  user  576 Mar 18 17:09 app_1_2_3_4

我在这里缺少什么?

只需省略目录即可。

$ ls -l factory
total 0
-rw-r--r-- 1 user user 0 mar 18 18:06 app_1_2_3_4

$ python
>>> import os
>>> os.symlink('app_1_2_3_4', 'factory/bar')
>>> quit()

$ ls -l factory/bar
lrwxrwxrwx 1 user user 11 mar 18 18:10 factory/bar -> app_1_2_3_4

顺便说一句, ln -s的工作方式完全相同:

$ ln -s app_1_2_3_4 factory/foo

$ ls -l factory/foo
lrwxrwxrwx 1 user user 11 mar 18 18:09 factory/foo -> app_1_2_3_4

os.symlink()从文档中获取一个参数dir_fd ,它是一个目录描述符:

如果dir_fd不是None ,它应该是一个引用目录的文件描述符,并且操作的路径应该是相对的; 然后路径将相对于该目录。

您可以在os.open()的帮助下获取目录描述符,见下文。

(理想情况下,您还想在加入路径时使用f-stringsos.path.join() 。)

import os

# Assuming you are getting 'app_dir_ver_path' from somewhere else
# and 'major', 'minor', 'bugfix', 'build' are defined.
# "/home/user/factory/app_1_2_3_4"
app_dir_ver_path = os.path.join(
    /home/user/factory,
    f'app_{major}_{minor}_{bugfix}_{build}'
)

# Get the directory where the symlink is supposed to be created:
# "/home/user/factory"
app_dir_ver_name = os.path.dirname(app_dir_ver_path)

# Get the name of the directory to be linked:
# "app_1_2_3_4"
app_dir_ver_base = os.path.basename(app_dir_ver_path)

# Get the directory desciptor:
dir_fd = os.open(app_dir_ver_name, os.O_RDONLY)

# Full path for the symlink:
# "/home/user/factory/app"
app_dir_path = os.path.join(app_dir_ver_name, 'app')

os.symlink(src=app_dir_ver_base, dst=app_dir_path, dir_fd=dir_fd)

从系统上的任何地方运行,在/home/user/factory中创建符号链接:

ls -l /home/user/factory/
lrwxrwxrwx@  1 user  user   13 Mar 15 04:27 app -> app_1_2_3_4
drwxrwxr-x@ 18 user  user  576 Mar 18 17:09 app_1_2_3_4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM