我写了一个小脚本来同步两个目录。该脚本允许同步某些文件类型并允许通过校验和或日期进行文件比较。在比较之后,应该复制的文件列表被提供给使用shutil.copy2()模块的文件复制过程。在各种测试运行中,我发现了 shutil.copy2 的奇怪行为,我没有解决方法:
第一:如果源是 ext3 卷,目标是 fat32(记忆棒),shutil 会引发错误。我认为这是因为 shutil.copy2 也尝试复制元数据,而 fat32 不支持这一点。但我不知道如何通过 try: except: 语句来捕获此错误。
第二:第二个问题更难。源和目标都是 ext3 卷。在源代码上有完整 Linux 目录树的一些备份。当我的实用程序尝试同步这些目录树时,脚本会无限循环运行,直到我的系统分区空间不足。我尝试修复此行为并在开始复制过程之前使用 stat 模块检查源文件是否为常规文件,但这无济于事。具有奇怪行为的文件是/proc/661/fd/3。也许还有更多,但我无法测试,因为我的系统在尝试复制此文件时由于内存消耗而冻结。
这两个问题我找了几天的解决办法,希望身边的高手多多支持。
谢谢你的帮助。
这是我的文件复制过程的代码:
def _filecopy(file_list, from_dir, to_dir, overwrt):
print "Files and directories will be processed: "
for file_tupel in file_list:
source_file_name = from_dir + file_tupel[1] + file_tupel[0]
try:
filemode = os.stat(source_file_name).st_mode
except:
filemode = 33205
if S_ISREG(filemode):
target_dir_name = to_dir + file_tupel[1]
if not os.path.isdir(target_dir_name):
print "Create directory " + target_dir_name
_mkdir(target_dir_name)
target_file_name = target_dir_name + file_tupel[0]
if os.path.isfile(target_file_name) and overwrt == "mark":
name_appendix = "_marked_by_sync_as_different_on_" + time.strftime("%a_%d_%b_%Y_%H-%M-%S", time.localtime())
if target_file_name.find(".") == -1:
new_target_file_name = target_file_name + name_appendix
new_source_file_name = source_file_name + name_appendix
else:
new_target_file_prefix = target_file_name.rpartition(".")[0]
new_target_file_extension = target_file_name.rpartition(".")[2]
new_target_file_name = new_target_file_prefix + name_appendix + "." + new_target_file_extension
new_source_file_prefix = source_file_name.rpartition(".")[0]
new_source_file_name = new_source_file_prefix + name_appendix + "." + new_target_file_extension
print "Rename file " + target_file_name + " in " + new_target_file_name
os.rename(target_file_name, new_target_file_name)
print "Copy file " + new_target_file_name + " to " + new_source_file_name
try:
shutil.copy2(new_target_file_name, new_source_file_name)
except:
print "Could not copy " + new_target_file_name + " to " + new_source_file_name
print "Copy file " + source_file_name + " to " + target_file_name
try:
shutil.copy2(source_file_name, target_file_name)
except:
print "Could not copy " + source_file_name + " to " + target_file_name
else:
print source_file_name + " seems to be no regular file and will not be copied."
按照第 1 号答案的提示后,shutil,copy2 语句更改为:
shutil.copyfile(source_file_name, target_file_name)
try:
#try to set permission bits
shutil.copymode(new_target_file_name, new_source_file_name)
except:
print "Permission bits could not be copied"
try:
#try to copy metadata
shutil.copystat(new_target_file_name, new_source_file_name)
except:
print "Metadata could not be copied"