User since
2007-01-03
36
Artikel
BenutzerIn
Hallo Zusammen,
ich möchte mir aus einem Windows Verzeichnis alle *.sql Dateien mit Datum und Uhrzeitangabe anzeigen lassen. Wenn ich die Folgenden beiden Programmcode aufrufe erhalte ich aber nur die Dateinamen ohne Datum und Uhrzeit. Was muss ich angeben um zusätzlich das Datum und Uhzeit mit angezeigt zu bekommen?
##########################################
chdir ("$sst_path") or die "chdir nach $sst_path nicht möglich : $!";
@Dateien=glob ("*.*");
my @Log_Dateien = glob("*.sql")
foreach (@Log_Dateien) {
print "$_\n";
}
##########################################
Ausgegeben wird folgende Datei ohne Datumsangabe: sqlnet.log
Ich hätte aber gerne folgend Ausgabe (oder ähnlich: sqlnet.log 03.01.2007 13:23
Ich habe alternativ auch schon folgendes ausprobiert:
##########################################
opendir SST_PATH, $sst_path or die "Kann $sst_path nicht öffnen: $!";
while ($dateinamen = readdir SST_PATH) {
next unless $dateinamen =~/\.sql$/;
print "$dateinamen\n";
}
closedir SST_PATH;
##########################################
Allerdings bekomme ich hier auch nur den Dateinamen ausgegeben. In dem OREILLY Buch "Einfürhung in Perl" und im Internet kann ich keinen Lösungsansatz finden. Ich befasse mich allerdings auch erst seit 3 Tagen mit Perl. Kann mir evtl. jemand unter die Arme greifen ?
DANKE
Gruß, Markus
User since
2003-08-21
2614
Artikel
ModeratorIn
Du kannst das Datum etc. mit der Funktion stat() (siehe perldoc) abfragen (fuer jeden Dateinamen einzeln).
User since
2006-07-05
334
Artikel
BenutzerIn
Gemeint ist das Package
File::Stat
Zur Benutzung siehe
Screenshot 1 und
Screenshot 2
Der reguläre Kommandozeilenbefehl unter Windows wäre z.B. "dir *.sql /O:D"
mfg MisterL
“Perl is the only language that looks the same before and after RSA encryption.”
User since
2003-08-04
14371
Artikel
ModeratorIn
@MisterL: Es gibt auch eine Built-In stat-Funktion (siehe perldoc -f stat). Das Modul
File::stat bietet diese Informationen in Objektorientierter Art und Weise (und verwendet die internen Funktionen)...
User since
2007-01-03
36
Artikel
BenutzerIn
Danke für den Hinweis.
Ich habe mir anhand der Funktion stat() mal das folgende Script zusammengebaut (geschustert). Werde ich morgen mal weiter verfeinern.
##########################################
my $file = "sqlnet.log";
my $logpath = "D:/temp/";
chdir ("$logpath") or die "chdir nach $logpath nicht möglich : $!";
my @dateistat = stat($file);
my $zeitstempel = $dateistat[9]; # [9]=Zeitstempel des letzten schreibenden Zugriffs
my $datum = localtime $zeitstempel;
my($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat,
$Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime $zeitstempel;
$Monat+=1; #Monat +1(++), weil er er sonst von 0 bis 11 gezählt wird
$Jahr+=1900; #Jahr +1900 weil time nur die vergangene Zeit ab 1900 ausgibt
$zeitstempel=sprintf("%4d.%02d.%02d %02d:%02d:%02d",$Jahr,$Monat,$Monatstag,$Stunden,$Minuten,$Sekunden);
print "$file $zeitstempel\n";
##########################################
Ausgegeben wird jetzt: sqlnet.log 2006.12.05 06:01:01
Allerdings ist der Programmcode ziemlich wüst. Ich sehe mir auch mal das Package File::Stat an.
Vielleicht hat ja noch jemand einen Verbesserungsvorschlag für mein Script.
DANKE
User since
2003-08-04
14371
Artikel
ModeratorIn
my $file = "sqlnet.log";
my $logpath = "D:/temp/";
my $time = (stat($logpath . $file))[9];
my @info = localtime $zeitstempel;
$info[4]++; #Monat +1(++), weil er er sonst von 0 bis 11 gezählt wird
$info[5]+=1900; #Jahr +1900 weil time nur die vergangene Zeit ab 1900 ausgibt
$stamp =sprintf("%4d.%02d.%02d %02d:%02d:%02d",@info[5,4,3,2,1,0]);
print "$file $zeitstempel\n";
\n\n
<!--EDIT|renee|1167834278-->
User since
2005-08-17
1420
Artikel
BenutzerIn
Um das mit dem Zeitstempel einfacher zu machen, kannst du auch die Funktion strftime aus dem Modul
POSIX nutzen:
use POSIX qw/strftime/;
my $zeitstempel = strftime("%d.%m.%Y %H:%M:%S", localtime($dateistat[9]));
User since
2007-01-03
36
Artikel
BenutzerIn
Hallo Renee,
danke für die Verfeinerung des Scripts. Da es vielleicht noch andere gebrauchen können, lege ich es hier noch einmal so ab wie es bei mir jetzt funktioniert.
Quotemy $file = "sqlnet.log";
my $logpath = "D:/temp/";
my $timestamp = (stat($logpath . $file))[9];
my @info = localtime $timestamp;
$info[4]++; #Monat +1(++), weil er er sonst von 0 bis 11 gezählt wird
$info[5]+=1900; #Jahr +1900 weil time nur die vergangene Zeit ab 1900 ausgibt
$timestamp=sprintf("%4d.%02d.%02d %02d:%02d:%02d",@info[5,4,3,2,1,0]);
print "$file $timestamp\n";
User since
2007-01-03
36
Artikel
BenutzerIn
[quote=nepos,03.01.2007, 15:24]Um das mit dem Zeitstempel einfacher zu machen, kannst du auch die Funktion strftime aus dem Modul
POSIX nutzen:
use POSIX qw/strftime/;
my $zeitstempel = strftime("%d.%m.%Y %H:%M:%S", localtime($dateistat[9]));
[/quote]
Hallo nepos,
wie müsste ich die POSIX Funktion in mein Script einbauen? Irgendwie krieg ich es nicht gebacken. Ich bin zwar mit der jetzigen Lösung voll und ganz zufrieden, bin aber für weitere Verbesserungen immer aufgeschlossen.
User since
2005-08-17
1420
Artikel
BenutzerIn
Naja, POSIX ist ein Modul. Die Use-Anweisung sollte dieses Modul in dein Skript einbinden. Der Part mit qw// importiert die Funktion strftime in den Namensraum deines Skriptes.
Eigentlich sollte es reichen, wenn du die beiden Zeilen wie oben uebernehmen wuerdest. Das POSIX-Modul ist normal immer vorhanden.