Python 2.7.3:复制符号链接,但不要跟随

3

我正在使用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,直到没有要复制的文件

感谢您的反馈。

1个回答

3
你想复制目录树的某些部分?那么,请尝试使用shutil.copytree()

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

因此,只要您不需要保持元数据不变,这应该可以正常工作(实际上,仅有的符号链接是否具有此类元数据,还是只是引用它们指向的文件/对象的元数据?)。还请注意,您并不必使用copytree()复制整个树;ignore参数允许您提供可调用函数来剪裁要复制的文件和目录。

但要注意一点:如果您修改传递给ignore可调用函数的内容列表,那么这也会影响所复制的内容(正如在 copytree()源代码中所示)。


(从评论复制/转述)

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


我已经给我的问题添加了更多细节。我认为shutil.copytree()对我目前的解决方案不适用。 - rkyser
也许不是,但我提供的copytree()实现展示了当simlinks为真时copytree()如何处理符号链接。为什么不以此作为参考呢?你可以简单地包装shutil.copy()shutil.copy2(),添加shutil.copytree()中的几行额外代码来使用它们。 - JAB
看起来 shutil.copytree() 函数使用 linkto = os.readlink(srcname) 后跟 os.symlink(linkto, dstname)。这基本上就是我作为“解决办法”的所做的!我想这意味着这才是正确的方法。 - rkyser
我应该将其标记为答案,因为评论中包含了答案吗?还是最好单独添加答案呢? - rkyser
编辑了我的答案,包括copytree()中(大部分)相关的代码行。 - JAB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接