diff options
author | Lars Wirzenius <liw@liw.fi> | 2011-02-12 22:13:18 +0000 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2011-02-12 22:13:18 +0000 |
commit | 25936f0ccea8bfa7bfc6226f47ea0ef651a8ef7e (patch) | |
tree | b0fed897e49bbdc5466872dc47041bed98e10721 /dupfiles | |
parent | c750d090ebf0d132e08e7b1f8743d86bfe152ef5 (diff) | |
download | dupfiles-25936f0ccea8bfa7bfc6226f47ea0ef651a8ef7e.tar.gz |
Make hardlinks only when uid, gid, mode match.
Diffstat (limited to 'dupfiles')
-rwxr-xr-x | dupfiles | 20 |
1 files changed, 15 insertions, 5 deletions
@@ -217,12 +217,22 @@ class Dupfiles(cliapp.Application): else: self.report(duplicates) - def make_hardlinks(self, duplicates): - canonical = duplicates.pop() - for pathname in duplicates: - os.remove(pathname) - os.link(canonical, pathname) + def get_meta(self, name): + st = os.lstat(name) + return st.st_uid, st.st_gid, st.st_mode + def make_hardlinks(self, duplicates): + dups = [(name, self.get_meta(name)) for name in duplicates] + + while dups: + canonical, meta = dups[0] + dups = dups[1:] + same = [x for x, y in dups if y == meta] + dups = [(x,y) for x, y in dups if y != meta] + for pathname in same: + os.remove(pathname) + os.link(canonical, pathname) + def remove_all_but_one(self, duplicates): keep = duplicates.pop() for pathname in duplicates: |