diff options
Diffstat (limited to 'dupfiles')
-rwxr-xr-x | dupfiles | 84 |
1 files changed, 38 insertions, 46 deletions
@@ -17,6 +17,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. +import cliapp import errno import hashlib import optparse @@ -189,55 +190,46 @@ class DuplicateFileFinder(object): else: not_done.append((pathname, f, data)) return done, not_done + + +class Dupfiles(cliapp.Application): + + def add_settings(self): + self.add_boolean_setting(['make-hardlinks'], + 'hardlink duplicate files to each other') + self.add_boolean_setting(['progress'], 'report progress') + self.add_boolean_setting(['remove'], + 'remove all but one copy of identical files') + + def process_args(self, args): + dupfinder = DuplicateFileFinder(self['progress']) + for dirname in sorted(args): + dupfinder.collect(dirname) + + for duplicates in dupfinder.duplicates(): + if self['make-hardlinks']: + self.make_hardlinks(duplicates) + elif self['remove']: + self.remove_all_but_one(duplicates) + else: + self.report(duplicates) + def make_hardlinks(self, duplicates): + canonical = duplicates.pop() + for pathname in duplicates: + os.remove(pathname) + os.link(canonical, pathname) -def make_hardlinks(duplicates): - canonical = duplicates.pop() - for pathname in duplicates: - os.remove(pathname) - os.link(canonical, pathname) - - -def remove_all_but_one(duplicates): - keep = duplicates.pop() - for pathname in duplicates: - os.remove(pathname) - - -def report(duplicates): - sys.stdout.write('\n'.join(duplicates)) - sys.stdout.write('\n\n') - - -def main(): - parser = optparse.OptionParser() - parser.add_option('--make-hardlinks', action='store_true', - help='hardlink duplicate files to each other') - parser.add_option('--progress', action='store_true', - help='report progress') - parser.add_option('--remove', action='store_true', - help='remove all but one copy of identical files') - - opts, args = parser.parse_args() - - dupfinder = DuplicateFileFinder(opts.progress) - for dirname in sorted(args): - dupfinder.collect(dirname) - + def remove_all_but_one(self, duplicates): + keep = duplicates.pop() + for pathname in duplicates: + os.remove(pathname) - for duplicates in dupfinder.duplicates(): - if opts.make_hardlinks: - make_hardlinks(duplicates) - elif opts.remove: - remove_all_but_one(duplicates) - else: - report(duplicates) + def report(self, duplicates): + sys.stdout.write('\n'.join(duplicates)) + sys.stdout.write('\n\n') if __name__ == '__main__': - profname = os.environ.get('DUPFILES_PROFILE') - if profname: - import cProfile - cProfile.run('main()', profname) - else: - main() + Dupfiles().run() + |