initial import
This commit is contained in:
parent
5067c06ad0
commit
692ec451fe
1 changed files with 78 additions and 0 deletions
78
safe_mv/safe_mv
Executable file
78
safe_mv/safe_mv
Executable file
|
|
@ -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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue