【问题标题】:Recursively creating hardlinks using python使用python递归创建硬链接
【发布时间】:2012-06-02 10:36:16
【问题描述】:

我基本上想做的是cp -Rl dir1 dir2。但据我了解,python 仅提供 shutils.copytree(src,dst) 实际复制文件,但不可能硬链接文件。

我知道我可以使用subprocess 模块调用cp 命令,但我希望找到一种更简洁的(pythonic)方式来执行此操作。

那么有没有一种简单的方法可以做到这一点,还是我必须自己通过目录递归来实现它?

【问题讨论】:

  • 目录遍历很简单,何不试试呢?
  • 这与尝试或不尝试无关:这个问题更想说“我无法想象这在数百次之前还没有完成,因此必须在模块 xy 中可用”。一直在重新发明轮子似乎是不对的。

标签: python directory directory-structure hardlink


【解决方案1】:

您只需拨打os.system("cp -Rl dir1 dir2"),无需手写您自己的功能。

已编辑:因为您想在 python 中执行此操作。

你是对的:它在模块shutil中可用:

shutil.copytree(src, dst, copy_function=os.link)

【讨论】:

  • 正如我所说,我不想使用 subprocess 模块。这也意味着我不想使用os.system 调用,因为它比subprocess 给我的控制更少。特别是因为os.system 可能会默默地失败。
  • @twall:请注意,这仅适用于 Python 3。在 Python 2 中,您可以修改示例代码:docs.python.org/library/shutil.html#copytree-example
  • 啊太棒了!我现在已经使用了 Damian Ayers 的示例,并根据我的需要对其进行了修改,但这实际上是我想到的解决方案。 (我之前应该查看一下shutil 资源...)谢谢!
  • 我知道这已经很多年了,但我只想说“os.system”建议不是一个好建议。 `cp -l' 不是标准的。 GNU cp 和 FreeBSD cp 都支持它,但它不是必需的,因此在任何类型的脚本中使用都不是一个好主意。
  • 从 Python 文档中根本不清楚 copy_function=os.link 是否真的存在,或者需要人为创建。 (请参阅链接文档中的示例。)如果是这样,那么os.symlink 也应该是可能的。
【解决方案2】:

这是一个纯 python 硬拷贝函数。应该和cp -Rl src dst一样工作

import os
from os.path import join, abspath

def hardcopy(src, dst):
    working_dir = os.getcwd()
    dest = abspath(dst)
    os.mkdir(dst)
    os.chdir(src)
    for root, dirs, files in os.walk('.'):
        curdest = join(dst, root)
        for d in dirs:
            os.mkdir(join(curdst, d))
        for f in files:
            fromfile = join(root, f)
            to = join(curdst, f)
            os.link(fromfile, to)
    os.chdir(working_dir)

【讨论】:

  • 谢谢,我觉得不错,我试试看。
  • 很抱歉不接受您的答案,但另一个确实是该问题的正确答案,即使您的答案也解决了问题。再次感谢。
  • 不用担心。我没有过多地研究 python 3,但如果这就是你所使用的,那么它是一个更简洁的解决方案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2018-09-21
相关资源
最近更新 更多