[英]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-strings和os.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.