自動同步2個目錄python腳本

#!/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任務即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章