[Perl] Zeitstempel von Dateien

anddie

Well-known member
ID: 171
L
3 Mai 2006
2.270
133
Hi,

ich habe folgendes Problem.
Meine Verzeichnisstruktur sieht in etwa folgendermaßen aus:
DataVerzeichnis/Ordner1
DataVerzeichnis/Ordner2
DataVerzeichnis/Ordner3
DataVerzeichnis/Ordner4

In jeden Ordner werden Scriptgesteuert Dateien abgelegt. Es wird jeden Tag eine neue erstellt und eine alte rausgelöscht, so dass dort nur 30 Dateien rumliegen sollten.

Mich interessiert jetzt eigentlich nur, ob in jedem Ordner min. 1 Datei liegt, die nicht älter als 7 Tage ist. Sozusagen als Überprüfung, ob das Script min. 1x in der letzten Woche durchgelaufen ist.

Jetzt gibt es für Perl ja die wunderschöne Funktion namens "stat()".
Meine Frage ist jetzt nur, ob und wie ich stat() direkt auf das Verzeichnis anwenden kann, um festzustellen, ob darin min. 1 Datei liegt, die mein Kriterium erfüllt.

Und gibt es irgendwo eine schöne Erklärung, was atime, mtime und ctime eigentlich sind? Bekomme für ctime nämlich nie irgendwas angezeigt *grübel*

anddie
 
Bin grad zu faul ... harhar ... es selbst zu beschreiben, also picke ich mal das erste (englische) Google-Ergebnis raus:
https://www.brandonhutchinson.com/ctime_atime_mtime.html

Unter Windows hilft dir das Modul Win32API::File::Time weiter.

Die Doku zu stat:
https://perldoc.perl.org/functions/stat.html

Zudem gibt es die opendir-function (https://perldoc.perl.org/functions/opendir.html ), mit der du die Inhalte eines Verzeichnisses auslesen kannst. Einfach beide Funktionen in eine while-Schleife kombinieren.

Die glob-Funktion könnte dir vielleicht auch nützlich sein, liefert anhand einer Maske Dateien zurück. Allerdings wirst du stat so oder so anwenden müssen, um zu vergleichen ob es älter als 7 Tage ist. Für Datumskalkulationen könntest du das Modul Date::Calc heranziehen, welches sehr gute Funktionen bietet.

Falls du weitergehende Sachen brauchen solltest, gibt es bei search.cpan.org genug File::* Module die wirklich absolut jeden Zweck abdecken.

Ich denke, damit solltest du was anfangen können ;)
 
Wenn ich mich nicht grad irre geht das ohne jedes Modul ...

Code:
 if (-M <Pfad zur Datei> < 7) { print "Datei ist nicht aelter als 7 Tage"; };
 
Wie Du aus der Perl-Dokumentation erfährst, kannst Du stat nur auf Filehandles oder auf Filenamen anwenden, also nicht auf ganze Verzeichnisse.

Allerdings gibt es die Möglichkeit des Fileglobbing in PERL: :arrow: I/O-Operators. Damit kannst Du jedes Deiner Verzeichnisse in eine Liste von Namen der Einzeldateien verwandeln.

Aus jeder dieser Listen kannst Du dann mit der Funktion grep BLOCK LIST alle suchen, die nicht älter als 7 Tage sind, wobei BLOCK die entsprechende Bedingung enthält angewendet auf $_, das das Listenelement darstellt (siehe auch Funktion map).
 
Zuletzt bearbeitet:
Wie Du aus der Perl-Dokumentation erfährst, kannst Du stat nur auf Filehandles oder auf Filenamen anwenden, also nicht auf ganze Verzeichnisse.
Komisch, mit stat hab ich das aber hinbekommen.

PHP:
foreach $dir (glob("/pfad/zu/meinen/verzeichnissen/*"))
{ 
  my (undef, undef, undef, undef, undef, undef, undef, $size, $atime, $mtime, $ctime, undef, undef) = stat($dir);
  $last_change = localtime($mtime);
  if($mtime > (time() - (3600 * 24 * 7)))
  { print "OK - ".$last_change; }
  else
  { print "ERROR - ".$last_change; }
}

anddie
 
Komisch, mit stat hab ich das aber hinbekommen.
Nein, nicht komisch. Ich habe mich nur mißverständlich ausgedrückt. Natürlich ist ein Verzeichnis auch stat-bar, aber damit erhältst Du nur das Ergebnis, ob das Verzeichnis innerhalb der letzten 7 Tage geändert worden ist. Das ist nicht äquivalent dazu, dass es mindestens eine Datei darin gibt, die innerhalb der letzten 7 Tage geändert worden ist.

Für Deinen Fall ist aber Deine Lösung trotzdem adäquat, weil Dein Skript Dateien herauslöscht und wiederanlegt. Beides sind auf üblichen Filesystemen verzeichnisändernde Zugriffe.