#!/usr/bin/python
# -*- coding: utf8 -*-
import os
import sys
import filecmp
import re
import shutil
file_list = []
def recursive_dir(dir1):
"""
递归当前目录的文件和子目录
:param dir1: 传参 需要递归的目录
:return: 当前目录下所有文件和目录
"""
curDir = os.path.abspath(dir1)
file_list.append(curDir)
l = os.listdir(curDir)
for item in l:
realitem = os.path.join(curDir, item)
if os.path.isfile(realitem):
file_list.append(realitem)
if os.path.isdir(realitem):
recursive_dir(realitem)
return file_list
update_file_list = []
def comparame(dir1, dir2):
"""
递归比较2个目录的文件和目录
:param dir1: 源目录
:param dir2: 备份目录
:return: 需要进行同步的文件和目录
"""
dircomp = filecmp.dircmp(dir1, dir2)
# 源目录仅有的文件和目录
only_in_dir1 = dircomp.left_only
for item in only_in_dir1:
item = os.path.join(dir1, item)
if os.path.isfile(item):
# 如果是源目录仅有的文件,则直接添加到更新列表
update_file_list.append(item)
if os.path.isdir(item):
# 如果是源目录仅有的目录,则进行遍历,添加到更新列表
update_file_list.extend(recursive_dir(item))
# 如果不对全局的接收列表清空,将会产生重复的条目
del file_list[:]
# 文件名相同但其它属性或者内容不同的文件,这种也直接添加到更新列表
diff_in_dir1 = dircomp.diff_files
[update_file_list.append(os.path.join(dir1, x)) for x in diff_in_dir1]
# 或者这样写
#for item in diff_in_dir1:
# update_file_list.append(os.path.join(dir1, item))
# 如果存在相同子目录,则递归遍历
if len(dircomp.common_dirs) > 0:
for item in dircomp.common_dirs:
comparame(os.path.join(dir1, item), os.path.join(dir2, item))
# 返回总的需要同步的列表清单
return update_file_list
def main():
dir1 = os.path.abspath(sys.argv[1])
dir2 = os.path.abspath(sys.argv[2])
#dir1 = os.path.abspath('../0111')
#dir2 = os.path.abspath('../0110')
#print "源目录是:", dir1
#print "备份目录:", dir2
# 更新文件列表
source_files = comparame(dir1, dir2)
for item in source_files:
# 将源目录路径替换成备份目录路径
dest_item = re.sub(dir1, dir2, item)
# 如果需要同步的是目录,则创建
if os.path.isdir(item):
os.makedirs(dest_item)
# 如果需要同步的是文件,则复制
if os.path.isfile(item):
shutil.copyfile(item, dest_item)
main()
最后将此脚本放进crontab任务即可。