`
############################################################
# find_dupes.pl: Welche evtl. identischen Dateien habe ich?
############################################################
use strict;
use File::Find;
my %CheckedSums;
my @xxlFiles;
my $too_large = 20000000;
my $Newline = "\n";
############################################################
# Ausgabe: Ergebnisliste
############################################################
sub print_dupes
{
my $trennlinie = "-" x 20 . "$Newline";
print "Dateien wurden untersucht.$Newline";
print "Möglicherweise identisch:$Newline", $trennlinie;
my $keine = "(Keine identischen Dateien gefunden.)$Newline" . $trennlinie;
for(sort keys %CheckedSums)
{
if(scalar split("$Newline", $CheckedSums{$_} ) > 1)
{
print $CheckedSums{$_}, $trennlinie;
$keine = "$Newline";
}
}
print $keine;
if(scalar @xxlFiles > 1)
{
print "${Newline}Folgende ", scalar @xxlFiles,
" Dateien wurden nicht verglichen, weil sie sehr gross sind:";
print $trennlinie;
print join("$Newline", @xxlFiles), "$Newline";
}
}
############################################################
# Checksumme ermitteln
############################################################
sub checksum_file
{
local $/; # Slurp-Mode - ganze Datei einsaugen, nicht zeilenweise
open my $handle, $_ or return -1;
my $retval = unpack("%32C*", <$handle>) % 65535;
close $handle;
return $retval;
}
############################################################
# Groessen+Summen feststellen + in Ergebnisliste schreiben
############################################################
sub check_files
{
unless (-f)
{
# bei Verzeichnissen abbrechen
return;
}
# Eigenschaften der gefundenen Datei auslesen
my ($dev, $inode, $mode, $numlinks, $uid, $gid, $rdev, $size, $whatever)
= stat($_) or return;
unless($size <= 0 || $size > $too_large)
{
my $checksum = checksum_file($_);
unless($checksum < 0)
{
my $CheckID = sprintf("%032d %032d", $size, $checksum);
$CheckedSums{$CheckID} .= $File::Find::name . "$Newline";
}
}
if($size > $too_large)
{
push(@xxlFiles, $File::Find::name);
}
}
############################################################
# Hauptprogramm
############################################################
if ($#ARGV < 0)
{
die "Bitte mindestens einen Pfad angeben!$Newline";
}
for(@ARGV)
{
chomp;
if(! -d)
{
print "$_ wurde nicht gefunden oder ist kein Verzeichnis.$Newline$Newline";
next;
}
find(\&check_files, $_);
print_dupes();
}
############################################################
# EOF
############################################################
`
Schlagwort-Archive: Perl
extcnt.pl
Eine kleine Spielerei, um festzustellen, mit welchen Dateitypen man sich grad seine Festplatte vollgemĂÂŒllt hat:
`
############################################################
# extcnt.pl: Welche Dateitypen verbrauchen wieviel Plattenplatz?
############################################################
use strict;
use File::Find;
my $Bytes;
my %ExtSizes;
############################################################
# Ausgabe: AbschnittsĂÂŒberschrift
############################################################
sub print_head
{
print "-" x 46, "\n";
print $_, "\n";
printf("%-22s %22s\n", "Dateiendung", "Bytes");
print "-" x 46, "\n";
}
############################################################
# Ausgabe: Ergebnisliste
############################################################
sub print_body
{
for(sort { $ExtSizes{$a} <=> $ExtSizes{$b} } keys %ExtSizes)
{
my $endung = $_;
my $verbrauch = $ExtSizes{$_};
printf("%-22s %22s\n", $endung, $verbrauch);
}
}
############################################################
# Ausgabe: Ergebnisabschluss
############################################################
sub print_tail
{
print "-" x 46, "\n";
printf("%-22s %22s\n\n", "Summe:", $Bytes);
}
############################################################
# Dateiendung feststellen
############################################################
sub get_extension
{
my $fileext = $_;
if($_ =~ /\./)
{
# Juhu! Eine Datei mit .irgendwas dran.
$fileext =~ s/.*\.([^.]*)$/$1/;
$fileext = lc($fileext);
}
else
{
# Irgendwas ohne gescheite Extension
$fileext = 'Ohne Endung';
}
}
############################################################
# Dateigroessen feststellen + in Ergebnisliste schreiben
############################################################
sub extcount
{
unless (-f)
{
# bei Verzeichnissen abbrechen
return
};
my $fileext = get_extension();
# Eigenschaften der gefundenen Datei auslesen
my ($dev, $inode, $mode, $numlinks, $uid, $gid, $rdev, $size, $whatever)
= stat($_) or return;
$Bytes += $size; # Gesamtverbrauch aller Dateien
$ExtSizes{$fileext} += $size; # Verbrauch fuer diese Endung
}
############################################################
# Hauptprogramm
############################################################
if ($#ARGV < 0)
{
die "Bitte mindestens einen Pfad angeben!\n";
}
for(@ARGV)
{
$Bytes=0; # in jedem Verzeichnis bei 0 anfangen
undef %ExtSizes; # Leere Ergebnisliste
chomp;
if(! -d)
{
print "$_ wurde nicht gefunden oder ist kein Verzeichnis.\n\n";
next;
}
find(\&extcount, $_);
if($Bytes)
{
print_head();
print_body();
print_tail();
}
}
############################################################
# EOF
############################################################
`