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

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

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

>>> 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创建一个符号链接.

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/次时,它是如何工作的呢?通过将通配符转换为多个参数,您的shell实现了这一点.如果您只需使用通配符exec ln命令,它将在/home/guest/dir1/中查找一个名为*的源,而不是该目录中的所有文件.

Python的类似功能是这样的(如果您不介意将两个级别混合在一起,并忽略许多其他情况,如tildes、env变量、命令替换等,这些在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.walkfind . -name foo而不过滤名字."或者,就这一点而言,我想在没有贝壳球的情况下,为我做相当于ln -s /home/guest/dir1/* /home/guest/dir2/的事情."

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

not使用os.walk,因为它需要recursive个文件系统,所以它甚至不接近shell *扩展.

Linux相关问答推荐

没有发现运行时依赖关系,但它在S的运行时路径中有吗?

Linux 上 Ada 任务优先级的语义是什么?

Linux内核模块构建过程中,许可信息添加了前缀

线程创建会在 Linux 中触发页面错误吗?它与软脏 PTE 有什么关系?

我需要制作一个 awk 脚本来解析文件中的文本.我不确定我是否做得正确

docker rm 命令在具有相同操作系统的不同机器上返回不同的状态码

如何找出哪个进程正在消耗等待 CPU(即 I/O 阻塞)

具体来说,fork() 如何处理 Linux 中 malloc() 动态分配的内存?

无法在 Android Studio 中清理项目

如何 grep 精确的文字字符串(无正则表达式)

为什么 mmap() 比顺序 IO 快?

如何通过 ssh 判断 ubuntu 服务器上是否存在 php 和 apache

谁决定任何数据类型或 struct 的大小(取决于 32 位或 64 位)?

'&&' 与 '&' 与 Bash 中的 'test' 命令

发出信号并中断比较

从 FTP 服务器下载所有文件

如何使用 Linux 命令找到我的 shell 版本?

如何在 UNIX 中将字符串转换为整数

将默认 Python 版本从 2.4 更改为 2.6

Bash 将 awk 的输出捕获到数组中