Abrufen der Liste der Dateien sortiert nach änderungsdatum in Perl
Ich versuche, die Liste der Dateien sortiert nach änderungsdatum. Ich veränderte Sie das Beispielprogramm aus Sortieren-Verzeichnis und eine Liste von Dateien basierend auf Datum und Zeit und versuchte zu laufen.
sub get_sorted_files {
my $path = shift;
opendir my($dir), $path or die "can't opendir $path: $!";
my %hash = map {$_ => (stat($_))[9]}
map { "$dir$_" }
grep { m/.*/i }
readdir $dir;
closedir $dir;
return %hash;
}
my %files = get_sorted_files(".");
foreach my $keys (sort{$files{$a} <=> $files{$b}} keys %files) {
print "$keys\t", scalar localtime($files{$keys}), "\n";
}
Läuft bei mir auf meinem Windows XP 32-bit-Maschine mit Strawberry Perl version 5.12.1.0.
Dem Verzeichnis unter Windows ist:
Ausgabe:
Die Ausgabe macht nicht viel Sinn für mich. Was läuft falsch mit diesem Stück code und wie genau ist die foreach
Schleife Sortieren Sie die Liste der Dateien?
InformationsquelleAutor rkg | 2011-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
In
get_sorted_files
,$dir
ist ein glob, nicht der name des Verzeichnisses. Vielleicht meintest du$path
?InformationsquelleAutor mob
Gibt es mindestens 2 Probleme mit diesem code. Hier ist eine bessere version:
Erste, den Sie umbenannt
$dir
im original-code zu$path
, aber wollte es nicht ändern, in dermap
Linie. Ihre$dir
ist ein Verzeichnis-handle; das ist, wo die GLOB(0x...) kommt.Zweiten, all das änderungsdatum Lesen "Wed Dec 31 16:00:00 1969", denn Sie kamen an einem bad-Pfadname
stat
.(stat($_))[9]
war die Rückgabe eine leere Liste (weil Sie waren auf der Suche für eine Datei wieGLOB(0x3f9b38)status.txt
statt der korrekten Pfadnamen) und so den hash, der eigentlich Wunde, die Dateinamen wie beide Schlüssel und Werte. Die erste mit dem Namen war ein Schlüssel, der zweite war sein Wert, das Dritte war der nächste Schlüssel, und so weiter.localtime
war die Umwandlung der Dateinamen eine Zahl (von 0), und dann die Umwandlung Epoche Zeit 0 (1-Jan-1970 0:00:00 UTC), um Ihre Zeitzone.Dritte, es erwartet
$path
zu Ende, die mit einem Verzeichnis-Trennzeichen, und Sie waren vorbei"."
. Sie würde übergeben müssen"./"
, oder noch besser, es zu beheben, so dass die Funktion fügt eine Trennlinie ein, wenn nötig.Vierte, die
grep
nicht mehr alles Tat, und sollte entfernt werden. (Im original-code, wählten nur bestimmte Dateinamen, aber Sie würde verändert das Muster, das auf alles.)Als für wie es sortiert Dateinamen:
get_sorted_files
gibt eine Liste von Pfadnamen und Modifikation Zeiten, die Sie speichern in den%files
hash.keys %files
gibt die Liste der Schlüssel (dem Dateinamen) und sortiert Sie durch einen numerischen Vergleich der zugeordnete Wert (der Zeitpunkt der änderung).InformationsquelleAutor cjm
Verwenden Perl's Sortieren Funktion. Es ist schneller, und Sie werden bekommen, was Sie wollen, ohne den hash.
Wissen, die oben genannten, können wir sagen, so etwas wie die folgenden:
InformationsquelleAutor turningtaxis
Für wirklich große Verzeichnisse, die Sie finden können, dass Perl ist deutlich langsamer als die nativen tools zu tun, die Sortierung. Zum Beispiel, auf meinem Rechner, auf einem riesigen (341k Dateien Verzeichnis, diese dauert etwa 1,5 Minuten:
Aber der code in der Lösung oben (mit
opendir
undsort -M
) dauert 30-45 Sekunden länger. Es ist nicht nur deutlich schneller, Sie können auch verhindern, Perl speichert die gesamte array im Speicher, das kann ein Gewinn sein, auf seine eigene.Beachten Sie, dass die oben auf einem ziemlich high-end-Linux-blade-system, so YMMV pro Rechner/OS...
InformationsquelleAutor CurtinsCreations