Sh4n3e

[Python] 이름만 다른 동일 파일 삭제하기 본문

Programming/Python

[Python] 이름만 다른 동일 파일 삭제하기

sh4n3e 2017. 8. 20. 18:33

사진을 정리해야할 일이 생겼다. 

하지만 이름은 다르지만 똑같은 사진이 너무 많았다. 

어찌정리할까 생각하다가 파이썬으로 간단하게 프로그램을 작성해 보았다.


기본원리는 다음과 같다.

1. 파일 Size가 같다면, 동일 파일일 가능성이 높다.(Greedy)

2. 동일 파일을 구분하기 위해서 전체적으로 비교하기보다는 해당파일의 바이너리를 일정 사이즈 단위로 불러와 Hash값을 만들어 비교한다.


해당 소스는 아래와 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import os, sys
import hashlib


file_list = []
cnt = 0
path = '/Users/leekeezz/Desktop/picture'

def filelist(path):
    global file_list
    global cnt
    file_list = os.listdir(path)
    file_list.sort()
    cnt = len(file_list)

def getHash(path, blocksize=65536):
    try :
        file = open(path, 'rb')
    except os.error:
        print 'file is deleted!!!!'
        return 'x'
    hasher = hashlib.md5()
    buf = file.read(blocksize)
    while len(buf) > 0 :
        hasher.update(buf)
        buf = file.read(blocksize)
    file.close()
    return hasher.hexdigest()

filelist(path) #Get the file list at path
for i in file_list:
    DPath = path + '/' + i
    if DPath == '/Users/leekeezz/Desktop/picture/.DS_Store':
        continue;
    n1 = os.path.getsize(DPath)
    hash1 = getHash(DPath)
    print 'Search the file that equal to %s : %s // filesize : %dbytes'%(hash1,DPath,n1)
    for j in file_list:
        if i==j: continue
        D2Path = path + '/' + j
        if D2Path == '/Users/leekeezz/Desktop/picture/.DS_Store':
            continue;
        try :
            n2 = os.path.getsize(D2Path)
        except os.error:
            print "file is deleted!"
            continue
        if n1 == n2:
            print 'Detect Equal size file!! %s %s'%(i,j)
            hash2 = getHash(D2Path)
            if hash1 == hash2:
                print '%s is equal %s, so file Deleted'%(i,j)
                os.remove(D2Path)
 
cs


Comments