`
############################################################
# 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
############################################################
`
Archiv der Kategorie: Blog
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
############################################################
`
Moritz und Lotte sind wieder beisammen
Gestern abend hab ich Moritz wieder zu Lottchen in den Käfig gelassen. Er war ganz ausgelassen, hat an der Käfigdecke Purzelbäume geschlagen, und ist immer wieder zu Lottchen hin, um sie zärtlich zu beknabbern. Meine Güte, was mache ich nur mit ihm, wenn sie demnächst stirbt? Mit den andern beiden Vögeln wird er sich nicht vertragen. Von Liese weiß ich mit Sicherheit, dass sie Moritz nicht mag. Höchstens könnte ich dann versuchen, ihn mit Madame 13 zusammen in den ganz großen Käfig zu setzen, in dem ich vor ein paar Jahren noch die Viererbande untergebracht hatte (Max, Moritz, Liese und Lotte).
Inzwischen hab ich auch eine Technik raus, mit der ich Lottchen relativ undramatisch ihr Schmerzmittel geben kann: Ich ziehe mir einen weichen Fleece-Handschuh an, lege meine Hand sachte auf ihren Körper, und halte sie so an der Käfigwand fest. Die Spritze mit dem Sirup halte ich ihr dann durch die Gitterstäbe vor den Schnabel. Zum Glück schmeckt das Medikament der Lotte offenbar ganz gut, denn wenn ich sie erstmal „in Gewahrsam“ habe, schleckt sie sofort an der Spritze.
Der Wunsch als Vater des Gedanken
Man hört manchmal nur, was man hören will, besonders, wenn man sich Hoffnung einreden möchte – Spinnengift gegen das Tumorwachstum bekommt Lottchen nämlich nicht, sondern ein Schmerzmittel. Dass ich das erst gestern mittels Google erfahren habe lag daran, dass ich vom Tierarzt keine Verpackung und keinen Beipackzettel bekommen habe, sondern nur eine mit einem Gummideckel verschlossene Spritze, auf der mit Folienmarker handschriftlich der Medikamentenname stand: Metacam.
Ich wußte, dass man bei Vögeln Krebserkrankungen mit Spinnengift behandelt, und der Tierarzt hatte mir die Dosierung des Medikaments erklärt. Ob er mir auch gesagt hat, dass es ein Schmerzmittel ist? Ich kann mich nicht erinnern – vermutlich war ich einfach viel zu aufgeregt. Inzwischen hat sie auch an der Wellensittich-Waffel geknabbert, die ich vorgestern mit zwei Tropfen Metacam getränkt hatte. Heute habe ich ihr da noch mal ein Tröpfchen drauf getan.