Wie ich hier ja schon berichtet habe, schien mit das Modul File::Find zu der Zeit etwas unflexibel.Grund dafür war die Tatsache, daß ich keine Dateiendungen übergeben konnte bzw. nicht festlegen konnte, wie viele Ebenen durchsucht werden sollen bzw. nur die aktuelle Ebene oder inklusive Unterebene.
Dies ist zwar natürlich Möglich, aber leider nur per Umweg. Der Aufruf von File::Find erfolgt ja per Weiterlesen...
# Ist Hash-Element der Dateigröße schon vorhanden??? # Wenn nicht, dann Array anlegen, erster Wert ist die Dateigröße # Übrigens : Hier kann man die Verwendung eines Hashes mit (aus?) Arrays sehen push (@{$dateien{$size}},"$size") if (!defined @{$dateien{$size}}); push (@{$dateien{$size}},$_); }
# Ab hir steht in [filename,filename,filename] # jede Datei, aufgetielt nach Dateigroessen
@dateien=(); foreach (keys %dateien){ my @dats=@{$dateien{$_}}; # wenigstens 2 Filenamen müssen da sein, also @dats >= 3, da erster Eintrag die Dateilaenge next if @dats < 3;
&get_checksum(@dats); } %dateien=();
print qq~Dateien mit Nulllaenge:\n~; printjoin("\n",@nulllength);
################### # Parameter # Startdir ohne abschließendes /, aktuelles Verzeichnis = . # Unterverzeichnisse durchsuchen? 1: ja, 0: nein # Dateitypen in form .txt.htm.html , also direkt hintereinander, aber nur wenn nötig # ansonsten wird alles gezeigt ############################################# sub get_all_files{ my $startdir=shift; my $include_subdirs=shift; my $endings=shift; my %endings=(); $endings=~ s/\s//g; my @endings=split('\.',$endings); shift @endings;
if (@endings != 0){ $endings=1; # wenn Endungen angegeben foreach (@endings){ $endings{$_}=1; } } @endings=();
my @dateien=(); push (my @all_directories,$startdir);
foreachmy $akdir(@all_directories){ local *in; opendir (in,$akdir); my @all=readdir(in); closedir in;
foreachmy $akdatei (@all){ next if ($akdatei eq '..' || $akdatei eq '.'); if (-d "$akdir/$akdatei") { if ($include_subdirs == 1){ push (@all_directories,"$akdir/$akdatei"); next; } } else { if ($endings==0){ push (@dateien,"$akdir/$akdatei"); } else { my @endung=split('\.',$akdatei); my $endung=$endung[-1]; if ($endings{$endung} == 1){ push (@dateien,"$akdir/$akdatei"); } } } } } return @dateien; }
###################### # generiert Checksumme einer Datei ############################################# sub get_checksum{ my ($dateiname,$dateilaenge); my %tempfiles=(); # temporäre Files my $data='';
Vor kurzem stand ich vor dem Problem, daß auf einem von mir betreuten Webserver der Speicherplatz aufgebraucht war. Nach etwas herumsuchen stellte ich dann fest, daß es daran lag, daß viel Speicherplatz verschleudert wurde, weil viele identische Dateien mehrmals vorhanden waren.
Was lag also näher, als ein kleines Perl-Programm zu schreiben, das doppelte (identische) Dateien findet?
Die Funktion stat() ermittelt diverse Eigenschaften einer Datei auf einmal. Viele dieser Eigenchaften sind jedoch Unix-spezifisch. Manche dieser Eigenschaften lassen sich zwar auch auf anderen Plattformen erfragen, meist ist es jedoch einfacher, die Dateitestoperatoren für Dateien/Verzeichnisse zu verwenden. Die Funktion stat läßt sich im Gegensatz zu lstat nicht auf Dateirepräsentationen, sondern nur auf "Originale" von Dateien anwenden.
Mit dem Befehl rename können Sie Dateien und Verzeichnisse umbenennen. Der Syntax von rename lautet rename (Altername, Neuername);
Altername gibt die Datei oder das Verzeichnis an, das geändert werden soll, Neuername ist der neue Verzeichnis- bzw. Dateiname. Vorsicht Wenn der erste Parameter eine Datei ist und der zweite Parameter der Name eines anderen Verzeichnisses, wird die Datei in das andere Verzeichnis verschoben. Weiterlesen...
Nachdem ich hier ja schon über meine "Feldversuche" bezüglich dem Finden von Links auf Webseiten berichtet habe, scheine ich nun schon recht weit gekommen zu sein. Wer will kann sich ja mal die Ergebnisse ansehen und ein bißchen herumtesten. Zum Linkchecker bitte hier klicken.
Mit rmdir kann man unter Perl ein Verzeichnis löschen. Dazu muß dieses Verzeichnis allerdings vollkommen leer sein, es dürfen auch keine weiteren, leeren, Unterverzeichnisse enthalten sein.
Wurde das Löschen erfolgreich durchgeführt, wird ein true zurückgegeben, andernfalls ein false. Zusätzlich findet man dann in $! eine Fehlermeldung im Textformat. Weiterlesen...
Mit dem Befehl chdir legen Sie ein Verzeichnis als Arbeitsverzeichnis fest. Das bedeutet, daß man, ohne sich um den Verzeichnispfasd kümmern zu müssen, Dateien bearbeiten oder Scripte starten kann, die in diesem Verzeichnis liegen.
Der Pfadname kann dabei relativ oder absolut verwendet werden. Außerdem ist es auch möglich, daß kein Pfadname angegeben wird. Dann wird das Verzeichnis verwendet, das in der Umgebungsvariablen HOME angegeben ist. Weiterlesen...
Mal wieder etwas aus der Praxis: Ich stand (stehe) vor dem Problem, daß ich ein Skalar, oder genauer gesagt dem HTML-Quelltext einer Webseite nach Links durchsuchen mußte. Ich suchte also eine Möglichkeit, möglichst schnell alle Links nach dem Schema <a href="test.htm" .....>Linktext</a> zu finden und wenns denn geht gleich in ein Array zu schubsen.