summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2011-01-23 15:48:14 +0000
committerLars Wirzenius <liw@liw.fi>2011-01-23 15:48:14 +0000
commit45d509ce63eda1ff408c1fdd6a51b825d2f35e4c (patch)
treee0293b9525db34604f243a18a1a2599e7c67a5bd
parent4d09413cba113e424e4227752a2b6d905fcadeab (diff)
parentfb8a6a836f09ce1ea23d97da3a3f5e6eda5ec8f7 (diff)
downloaddupfiles-45d509ce63eda1ff408c1fdd6a51b825d2f35e4c.tar.gz
Merged use of cliapp.
-rw-r--r--debian/control2
-rwxr-xr-xdupfiles84
2 files changed, 39 insertions, 47 deletions
diff --git a/debian/control b/debian/control
index a951e5c..5919bec 100644
--- a/debian/control
+++ b/debian/control
@@ -8,7 +8,7 @@ Build-Depends: debhelper (>= 7.3.8), python-support (>= 1.0.3), python (>= 2.5)
Package: dupfiles
Architecture: all
Depends: ${python:Depends}, ${misc:Depends}, python (>= 2.5),
- python-progressbar
+ python-progressbar, cliapp
Description: find and optionally hard-link duplicate files
dupfiles finds files with identical content, and either reports them,
or hardlinks them to each other.
diff --git a/dupfiles b/dupfiles
index 78e4b5f..0fa736b 100755
--- a/dupfiles
+++ b/dupfiles
@@ -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()
+