我正在尝试复制一个目录到一个新的位置。当它到达新位置时,我希望新目录的最后修改日期是将其复制到新位置的时间。
查看文档(我使用的是python3.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()不应该维护超出文件权限的元数据。
有趣的是,在查看副本的目标时,我可以看到目录在恢复到源代码目录的修改日期之前,将其修改日期设置为当前时间。
提前感谢您的帮助。
发布于 2018-02-23 05:07:50
如果您试图阻止目录的元数据被复制,这是不可避免的。对于目录,首先不需要调用copy_function,因此更改它没有任何效果。copytree总是在树中的每个目录上调用copystat(),可以看到在其源代码中。请注意,这种情况不会发生在文件上,因为函数只在目录上递归(因此src指向常规文件的唯一方法是将文件作为参数传递)。
如果您真的很想让这个工作完成,您可以猴斑 copystat()什么也不做,但我不认为这是一个强有力的解决方案。使用步行目标目录结构并使用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/bazhttps://stackoverflow.com/questions/48940794
复制相似问题