【问题标题】:shutil.copytree with copy() maintains Metadata使用 copy() 的 shutil.copytree 维护元数据
【发布时间】:2018-02-23 03:46:10
【问题描述】:

我正在尝试将目录复制到新位置。当它到达新位置时,我希望新目录的最后修改日期是它被复制到新位置的时间。

查看文档(https://docs.python.org/3/library/shutil.html我使用的是 python 3.6),shutil.copytree 采用默认参数“copy_function”,即“shutil.copy2”,以便维护大多数元数据(如修改日期)。但是将其更改为“shutil.copy”,即:

shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=shutil.copy, ignore_dangling_symlinks=False)

似乎仍保持原始文件的修改日期。尽管根据文档,shutil.copy() 不应该维护超出文件权限的元数据。

有趣的是,观察副本的目的地,我可以看到该目录暂时将其修改日期设置为当前时间,然后恢复为源目录的修改日期。

提前感谢您的帮助。

【问题讨论】:

  • 你可能是shutil.copyfile 而不是shutil.copy
  • @Waylan 我试过使用shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=shutil.copyfile, ignore_dangling_symlinks=False),但结果相同

标签: python shutil


【解决方案1】:

如果您试图阻止目录复制其元数据,这是不可避免的。 copy_function 不是首先为目录调用的,因此更改它没有效果。 copytree 总是在树中的每个目录上调用 copystat(),如 in its source code 所示。请注意,文件不会发生这种情况,因为该函数仅在目录上递归(因此src 指向常规文件的唯一方法是您将文件作为参数传递)。

如果你真的很想完成这项工作,你可以 monkey patch copystat() 什么都不做,但我几乎不会认为这是一个强大的解决方案。将目标目录结构walk 并使用os.utime() 手动重置每个目录的修改时间会更安全。

如果您试图阻止文件的元数据被复制,我无法重现您的问题:

kevin@instance-1 ~ % mkdir foo
kevin@instance-1 ~ % mkdir foo/bar
kevin@instance-1 ~ % touch foo/bar/baz --date 19700101    
kevin@instance-1 ~ % ls -l foo/bar/baz
-rw-r--r-- 1 kevin kevin 0 Jan  1  1970 foo/bar/baz
kevin@instance-1 ~ % python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import shutil
>>> shutil.copytree('./foo', './qux', symlinks=False, ignore=None, copy_function=shutil.copy, ignore_dangling_symlinks=False)
'./qux'
>>> 
kevin@instance-1 ~ % ls -l qux/bar/baz 
-rw-r--r-- 1 kevin kevin 0 Feb 23 05:04 qux/bar/baz

【讨论】:

  • 感谢您的洞察力。在将相关目录的 st_mtime 值复制到新位置后,我已开始使用 time.time() 将其编辑为当前时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 2022-08-16
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多