当前位置: 首页 > 面试题库 >

`os.symlink`与`ln -s`

窦宏旷
2023-03-14
问题内容

我需要为dir2中的dir1(文件或目录)的每个项目创建一个符号链接。dir2已经存在,并且不是符号链接。在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.walk或解决方法glob.glob,但是我想知道是否可以使用os.symlink


问题答案:

os.symlink 创建一个符号链接。

ln -s创建多个符号链接(如果它的最后一个参数是目录,并且有多个源)。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/?您的 外壳
通过将通配符转换为多个参数来实现此目的。如果你是刚刚execln命令使用通配符,它会寻找一个单一来源字面上命名*/home/guest/dir1/,在该目录中没有的所有文件。

Python等效项是这样的(如果您不介意将两个级别混合在一起,而忽略了许多其他情况,例如shell可能出现的波浪号,env变量,命令替换等):

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仅凭它的一部分来做到这一点,因为它不能做到这一点。这就像在说:“我想做的事情等同于find . -name foo使用os.walk而不过滤名称”。或者,就这一点而言,我想做的事情就等于ln -s /home/guest/dir1/* /home/guest/dir2/不让我的外壳出现问题。”

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

千万 不能 使用os.walk,因为做了 递归 文件系统的步行路程,所以它甚至还没有接近外壳*扩展。



 类似资料:
  • Python3 OS 文件/目录方法 概述 os.symlink() 方法用于创建一个软链接。 语法 symlink()方法语法格式如下: os.symlink(src, dst) 参数 src -- 源地址。 dst -- 目标地址。 返回值 该方法没有返回值。 实例 以下实例演示了 symlink() 方法的使用: #!/usr/bin/python3 import os src =

  • hadoop HDFS中有吗? 例如: 我只想将文件从复制到。 最简单的方法是使用。 但要花费更多的时间和磁盘空间。是否有类似shell的方法,如?

  • 这些函数通常给出一个结果的无理数,可能是通过泰勒级数计算的,但有没有关于这些级数重复多少次的文献 我想如果这是罪: < code>n应该是什么?< br >我需要这个,因为我需要自己创建数学函数,所以我应该知道这些操作应该重复多少次。谢谢

  • 然而,有一个错误发生了,我确实找到了一个解决方案,但它是暂时的。 当我运行使用的Python脚本时,抛出以下错误消息: 失败 但是,如果我在VM运行时输入该命令(),它确实可以使事情正常工作!然而,这并不能解决我的问题,因为我需要它在启动时是ok的,而如果我重新进入VM,问题又回来了。 我的DockerFile:

  • 如果要想说清楚 ln 命令,则必须先解释下 ext 文件系统(Linux 文件系统)是如何工作的。我们在前面讲解了分区的格式化就是写入文件系统,而我们的 Linux 目前使用的是 ext4 文件系统。如果用一张示意图来描述 ext4 文件系统,则可以参考图 1。 图 1 ext4 文件系统示意图 ext4 文件系统会把分区主要分为两大部分(暂时不提超级块):小部分用于保存文件的 inode (i

  • 本文向大家介绍Python math库 ln(x)运算的实现及原理,包括了Python math库 ln(x)运算的实现及原理的使用技巧和注意事项,需要的朋友参考一下 这个是很有用的一个运算,除了本身可以求自然对数,还是求指数函数需要用到的基础函数。 实现原理就是泰勒展开,最简单是在x=1处进行泰勒展开: 但该函数离1越远越难收敛,同时大于2时无法收敛,所以需要进行换元,然后重新展开: 但是该换元