【问题标题】:Python 2.7.3: Copying symlinks, but don't followPython 2.7.3:复制符号链接,但不要遵循
【发布时间】:2012-07-21 21:16:26
【问题描述】:

我使用的是 Python 2.7.3。我正在编写一个 Python 脚本来将目录树的一部分从一个位置复制到另一个位置。一些需要复制的文件是符号链接。

如何使用 Python 将符号链接从一个位置复制到另一个位置而不跟随它们? (我只是希望它像“常规”文件一样盲目地复制它们)

我发现 Python 3.3 的 shutil.copy() 支持参数 follow_symlinks=False,但旧版本的 shutil 不支持。

编辑:更多细节:

此脚本的目的是从指定位置获取所有文件并将它们拆分为单独的存档。我知道我可以通过压缩整个目录并拆分存档来做到这一点,但我需要能够单独提取每个存档而不重新加入一个大型存档。此外,每个存档必须小于指定大小。

基本方法:

  1. 获取源目录下所有文件的所有绝对路径
  2. 获取所有文件的所有大小
  3. 按大小对所有文件(无论位置如何)进行排序
  4. 将文件从位置 X 复制到 tmp 位置(直到复制文件的总和
  5. 创建 tmp 存档
  6. 清理 tmp 位置
  7. 还有文件要复制时返回 4

任何反馈都将不胜感激。谢谢。

【问题讨论】:

    标签: python linux python-2.7 symlink


    【解决方案1】:

    复制目录树的一部分,你说?在这种情况下,请尝试shutil.copytree()

    如果 symlinks 为真,则源树中的符号链接表示为新树中的符号链接,但不会复制原始链接的元数据;如果为 false 或省略,则将链接文件的内容和元数据复制到新树中。

    因此,只要您不需要保持元数据相同,这应该可以正常工作(实际上,符号链接自己甚至可以拥有这样的元数据,或者它们只是引用文件/对象的元数据吗?指向?)。另请注意,您不必使用copytree() 复制整个树; ignore 参数允许您提供一个可调用的对象,该可调用对象将修剪要复制的文件和目录。

    但有一点需要注意:如果您修改传递给 ignore 可调用对象的内容列表,这也会影响复制的内容(如您在 the copytree() source code 中所见)。


    (从 cmets 复制/释义)

    由于shutil.copytree() 的实现显示了copytree() 如何处理符号链接(linkto = os.readlink(srcname); os.symlink(linkto, dstname)),因此即使copytree() 本身没有用,也可以作为如何“复制”符号链接的参考。

    【讨论】:

    • 我在我的问题中添加了更多细节。我认为shutil.copytree() 不适用于我目前设计的解决方案。
    • 也许不是,但我链接的copytree() 的实现向您展示了copytree()simlinks 为真时如何处理符号链接。为什么不把它作为参考呢?您可以使用自己的复制方法包装shutil.copy()shutil.copy2(),从shutil.copytree() 添加这几行额外的行并使用它。
    • 看起来shutil.copytree() 使用linkto = os.readlink(srcname) 后跟os.symlink(linkto, dstname)。这基本上就是我在“变通”时所做的!我想这意味着它就是这样做的方法。
    • 我应该将此标记为答案,因为 cmets 包含答案吗?还是单独添加答案会更好?
    • 编辑了我的答案以包含来自copytree()的(大部分)相关代码行。
    猜你喜欢
    • 1970-01-01
    • 2015-11-06
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    相关资源
    最近更新 更多