gpt4 book ai didi

python - `os.symlink` 与 `ln -s`

转载 作者:IT老高 更新时间:2023-10-28 12:39:25 31 4
gpt4 key购买 nike

我需要为 dir2 中的每一项 dir1(文件或目录)创建一个符号链接(symbolic link)。 dir2 已经存在并且不是符号链接(symbolic link)。在 Bash 中,我可以通过以下方式轻松实现:

ln -s /home/guest/dir1/* /home/guest/dir2/

但是在 python 中使用 os.symlink 我得到一个错误:

>>> os.symlink('/home/guest/dir1/*', '/home/guest/dir2/')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 17] File exist

我知道我可以使用 subprocess 并运行 ln 命令。我不想要那个解决方案。

我也知道使用 os.walkglob.glob 的解决方法是可能的,但我想知道是否可以使用 os.symlink.

最佳答案

os.symlink创建一个符号链接(symbolic link)。

ln -s 创建多个符号链接(symbolic link)(如果它的最后一个参数是一个目录,并且有多个源)。 Python 等价物类似于:

dst = args[-1]
for src in args[:-1]:
os.symlink(src, os.path.join(dst, os.path.dirname(src)))

那么,当你执行 ln -s/home/guest/dir1/*/home/guest/dir2/ 时它是如何工作的?您的 shell 通过将通配符转换为多个参数来实现这一点。如果您只是 exec 带有通配符的 ln 命令,它会在 /home 中寻找一个字面上名为 * 的单一源/guest/dir1/,并非该目录中的所有文件。

Python 等价物类似于(如果您不介意将两个级别混合在一起并忽略许多其他情况 - 波浪线、环境变量、命令替换等在 shell 中可能):

dst = args[-1]
for srcglob in args[:-1]:
for src in glob.glob(srcglob):
os.symlink(src, os.path.join(dst, os.path.dirname(src)))

你不能单独使用 os.symlink 来做到这一点——它的任何一部分——因为它不这样做。这就像说“我想使用 os.walk 来做相当于 find . -name foo 而不过滤名称。”或者,就此而言,我想做与 ln -s/home/guest/dir1/*/home/guest/dir2/ 等效的操作,而不需要 shell 为我服务。”

正确的答案是使用 glob,或 fnmatch,或 os.listdir 加上一个正则表达式,或任何你喜欢的。

不要使用os.walk,因为它会执行递归文件系统遍历,所以它甚至不接近shell * 展开。

关于python - `os.symlink` 与 `ln -s`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15580425/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com