1. 程式人生 > 實用技巧 >找出資料夾中的相同檔案,並移動到指定資料夾中

找出資料夾中的相同檔案,並移動到指定資料夾中

今天同事找我,說需要把多個資料夾內相同的檔案拿出來放到一起,就順手寫了這個,有需要的可以自己看看。

'''
找出資料夾中的相同檔案,並移動到指定資料夾中
'''

import hashlib
import os,shutil

def md5_vaule(dir):
	hasher = hashlib.md5()
	afile = open(dir, 'rb')
	buf = afile.read()
	a = hasher.update(buf)
	return str(hasher.hexdigest())


def file_name(file_dir):
	all =[]
	for root, dirs, files in os.walk(file_dir):
		tmp = []
		# print('root_dir:', root)  # 當前目錄路徑
		# print('sub_dirs:', dirs)  # 當前路徑下所有子目錄
		# print('files:', files)  # 當前路徑下所有非目錄子檔案
		for i in files:
			tmp.append(root+"\\"+i)
		for j in tmp:
			all.append(j)
	return all

def need_del(all_md5_in):
	all_md5_no_repeat = list(set(all_md5_in))
	all_md5_no_repeat.sort(key=all_md5_in.index)
	need_del_index = []
	for temp in all_md5_no_repeat:
		flag = 0
		list_index = []
		for n in range(all_md5_in.count(temp)):
		    sec = flag
		    flag = all_md5_in[flag:].index(temp)
		    list_index.append(flag + sec)
		    flag = list_index[-1:][0] + 1
		for k in range(1, len(list_index)):
			need_del_index.append(list_index[k])
	return need_del_index

def move_file(orgfile, newpath):
	shutil.move(orgfile, newpath)

def new_folder_create(in_del_folder, in_origl_folder):   # 將重複檔案移動到指定資料夾,為防止出現檔名相同情況,後面會補上檔案原所在路徑
	tmp1 = in_origl_folder.split(".")
	tmp2 = tmp1[-2].split(":")
	res_path = in_del_folder + tmp2[-1]
	os.makedirs(res_path)
	return res_path

def all_file_and_md5(filename, filemd5):     # 顯示所有檔案及其對應的md5
	for i in range(len(filename)):
		res=filename[i]+"    "+filemd5[i]
		print(res)

def how_much_repeat(all_in):                 # 找出有多少相同的檔案
	all_md5_set = list(set(all_in))
	all_md5_set.sort(key = all_in.index)
	# for k in all_md5_set:
	# 	print(k)
	return len(all_in)-len(all_md5_set)


if __name__ == '__main__':
	file_names = file_name("D:\\重複")       # 要處理的資料夾路徑
	del_folder = "D:\\重複del"               # 將重複的檔案拷到此路徑下,為防止出現檔名相同情況,後面會補上檔案原所在路徑
	all_md5 = []
	file_names_beifen = []
	all_md5_beifen = []
	for i in file_names:
		all_md5.append(md5_vaule(i))
		file_names_beifen.append(i)
		all_md5_beifen.append(md5_vaule(i))
	# all_file_and_md5(file_names,all_md5)           # 顯示所有檔案及其對應的md5
	print("有多少重複 ", how_much_repeat(all_md5))    # 找出有多少相同的檔案
	need_del_file = need_del(all_md5)                # 找出需要刪除的檔案在原資料夾陣列中的位置(下標)
	print("重複檔案如下:")
	for j in need_del_file:                          # 將重複的檔案移動到指定資料夾中
		print(file_names[j])
		new_folder = new_folder_create(del_folder, file_names[j])
		move_file(file_names[j], new_folder)

為了可以給大家提出更多的學習建議,這是我建立的Python學習圈子:1156465813。在彼此的溝通可以我們可以得到很多學習經驗,學習始終靠自己,當你掌握了一個好的學習方法,系統的學習方式,你會發現其實學習Python並沒有那麼難,有問題在群裡隨時問我,群內含有不少的學習資料,大家可以一起討論問題,共同進步。