3

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

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

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

编辑:更多细节:

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

基本方法:

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

对于任何反馈,我们都表示感谢。谢谢。

4

1 回答 1

3

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

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

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

不过要注意的一件事是:如果您修改传递给ignore可调用对象的内容列表,这也会影响复制的内容(如您在copytree()代码中所见)。


(从评论中复制/解释)

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

于 2012-07-23T15:54:16.640 回答