diff --git a/safe_mv/safe_mv b/safe_mv/safe_mv new file mode 100755 index 0000000..21ed553 --- /dev/null +++ b/safe_mv/safe_mv @@ -0,0 +1,78 @@ +#!/usr/bin/perl -w + +# $Id$ +# $Source$ + +# +# Scriptje om bestanden te moven, en bij het reeds bestaan van een bestand +# op de plek waar het naartoe gemoved wordt eerst even te vergelijken +# of ze identiek zijn. Zo nee, gaat de move niet door. Zo ja, delete +# te moven bestand. +# (C) 2001 Ward Wouts +# +# Argumenten $source-bestanden $target-dir +# + +use File::Copy; +use Digest::MD5 qw(md5); + +$DEBUG = 0; + +if ($#ARGV < 1) { &help; } + +$targetdir=pop; +if ( ! -d $targetdir ) { &help; } +if ( $DEBUG ) { print "$targetdir\n"; } + +foreach ( @ARGV ) { + $source = "$_"; + $target = "$_"; + $target =~ s/.*\///; + $target = $targetdir."/".$target; + if ( -e "$target" ) { + &compare($source, $target); + } else { + if ( $DEBUG ) { print "mv $_ -> $target\n"; } + else { move("$_", "$target") or die "move failed: $!"; } + } +} + +sub help { + print "Usage: $0 source_files target_dir\n"; + exit 1; +} + +sub compare($source, $target) { + my ($source_size, $target_size); + print "Comparing... "; +# First compare size. If this differs, we're done quickly. + if ( (-s $source) == (-s $target) ) { + if ( $DEBUG ) { print "$source and $target are the same size\n"; } + $source_digest = &calc_md5($source); + if ( $DEBUG ) { print "source digest $source_digest\n"; } + $target_digest = &calc_md5($target); + if ( $DEBUG ) { print "source digest $target_digest\n"; } + if ( $source_digest eq $target_digest ) { + print "Files are the same. Deleting $source.\n"; + unlink($source) + or die "Can't delete $source: $!\n"; + } else { + print "Skipped mv $source -> $target files differ\n" + } + } else { + print "Skipped mv $source -> $target files differ\n"; + } +} + +sub calc_md5($file) { + my ($file, $digest); + $file = shift; + $md5 = Digest::MD5->new; + open FILE, "<$file" or die "couldn't open file: $!\n"; + seek(FILE, 0, 0); + $md5->reset; + $md5->addfile(FILE); + $digest = $md5->hexdigest; + close(FILE); + return $digest; +}