Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带有copy()的shutil.copytree维护元数据_Python_Shutil - Fatal编程技术网

Python 带有copy()的shutil.copytree维护元数据

Python 带有copy()的shutil.copytree维护元数据,python,shutil,Python,Shutil,我正在尝试将目录复制到新位置。当它到达新位置时,我希望新目录的最后修改日期是它被复制到新位置的时间 查看文档(我使用的是Python3.6),shutil.copytree使用一个参数“copy_function”,默认情况下该参数为“shutil.copy2”,以便维护大多数元数据(如修改的日期)。但是,将其更改为“shutil.copy”,即: 似乎仍保留原始文件的修改日期。根据文档,即使shutil.copy()不应维护超出文件权限的元数据 有趣的是,通过查看副本的目的地,我可以看到,在恢

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

查看文档(我使用的是Python3.6),shutil.copytree使用一个参数“copy_function”,默认情况下该参数为“shutil.copy2”,以便维护大多数元数据(如修改的日期)。但是,将其更改为“shutil.copy”,即:

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

有趣的是,通过查看副本的目的地,我可以看到,在恢复到源目录的修改日期之前,目录的修改日期暂时设置为当前时间


提前感谢您的帮助。

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

<>如果你真的很想做这项工作,你可以<代码> CopyStand()/代码>什么也不做,但我几乎不认为这是一个健壮的解决方案。使用目标目录结构和手动重置每个目录的修改时间会安全得多


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

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

你可能需要什么
shutil.copyfile
而不是
shutil.copy
@Waylan我试过使用
shutil.copytree(src,dst,symlinks=False,ignore=None,copy\u function=shutil.copyfile,ignore\u dangling\u symlinks=False)
,但它产生了同样的结果感谢您的洞察力。我已经习惯使用
os.utime()
在将相关目录复制到其新位置后,使用
time.time()
将其st\mtime值编辑为当前时间。
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