SOLVED: Datum -> Epoch (Unixzeit)
SOLVED: Datum -> Epoch (Unixzeit)
Hallo,
ich habe folgendes Problem: Ein Script soll ein Verzeichnis prüfen ob da Files drin liegen welche älter als z.b. 2 Stunden sind.
Mein erster Ansatz war das ganze in einer for-Schleife abzufangen und mit cmin bzw. amin abzufangen. Funktioniert auch ganz wunderprächtig unter cygwin, linux .... leider jedoch nicht unter HPUX. Hier kennt das find maximal atime, ctime.
Der zweite Ansatz war ein FIle zu erstellen und die Erstellungszeit der Files im Verzeichnis von der Erstellungszeit des Kontrollfiles abzuziehen. Man kann auch mit date die Zeit in Unixzeit umwandeln.
date -d "13 Jan 2007 15:32:35" +%s
Funktionier unter Linux, cygwin - nicht aber - ihr könnts Euch bestimmt denken - HPUX.
Könnt Ihr mir verraten wie ich nun ein bestimmtes Datum in Unixzeit umrechnen kann?
Grüße
bka
ich habe folgendes Problem: Ein Script soll ein Verzeichnis prüfen ob da Files drin liegen welche älter als z.b. 2 Stunden sind.
Mein erster Ansatz war das ganze in einer for-Schleife abzufangen und mit cmin bzw. amin abzufangen. Funktioniert auch ganz wunderprächtig unter cygwin, linux .... leider jedoch nicht unter HPUX. Hier kennt das find maximal atime, ctime.
Der zweite Ansatz war ein FIle zu erstellen und die Erstellungszeit der Files im Verzeichnis von der Erstellungszeit des Kontrollfiles abzuziehen. Man kann auch mit date die Zeit in Unixzeit umwandeln.
date -d "13 Jan 2007 15:32:35" +%s
Funktionier unter Linux, cygwin - nicht aber - ihr könnts Euch bestimmt denken - HPUX.
Könnt Ihr mir verraten wie ich nun ein bestimmtes Datum in Unixzeit umrechnen kann?
Grüße
bka
Zuletzt geändert von bka am 17.01.2007 19:20:41, insgesamt 1-mal geändert.
hi,
vielleicht versteht der hpux-stat-Befehl das Sekunden-Format:
wobei es ein eigenstaendiges stat und einen Shell-internen
stat-Befehl geben koennte.
Als billigen Kompromiss koenntest du das date-Format '%j'
(Tag des Jahres) benutzen und die Sekunden seit 1. Januar
im Script selbst ausrechnen.
vielleicht versteht der hpux-stat-Befehl das Sekunden-Format:
Code: Alles auswählen
stat -c %Y $FILENAME
stat-Befehl geben koennte.
Als billigen Kompromiss koenntest du das date-Format '%j'
(Tag des Jahres) benutzen und die Sekunden seit 1. Januar
im Script selbst ausrechnen.
Beware of programmers who carry screwdrivers.
Nachdem ich grundsätzlich faul bin und mich andernfalls auch öfters mit solchen Problemen herumschlagen müßte, setze ich zumeist Perl als "Posix-Layer" ein:
Perl gibts fast überall, und solange man nicht irgendwelche Spezialfeatures eines Betriebssystems verwendet, funktioniert es auch überall gleich
Gruß
gms
Code: Alles auswählen
gms@aix1:~$ perl -MTime::Local -e 'print timelocal(35,32,15,13,0,2007),">
1168698755
gms@aix1:~$ perl -MPOSIX -e 'print strftime "%Y-%m-%d %H:%M:%S\n", localtime 1168698755;'
2007-01-13 15:32:35
Gruß
gms
siehst du hier:
Ist ein bißchen undurchsichtig, weil der 1 Monat des Jahres dern Wert 0 hat
Gruß
gms
[edit]
sehe gerade, daß oben auch beim Kopieren etwas schief gegangen ist
So sollte das ausschauen:
[/edit]
Code: Alles auswählen
gms@aix1:~$ perl -MPOSIX -e 'print strftime "%Y-%m-%d %H:%M:%S\n", localtime 1168698755;'
2007-01-13 15:32:35
Gruß
gms
[edit]
sehe gerade, daß oben auch beim Kopieren etwas schief gegangen ist
So sollte das ausschauen:
Code: Alles auswählen
gms@gms4:~$ perl -MTime::Local -e 'print timelocal(35,32,15,13,0,2007),"\n"'
1168698755
export STUNDE=14
export MINUTE=34
export TAGE=13
export MONAT=Jan
export JAHR=2007
perl -MTime::Local -e 'print timelocal($SEKUNDE,$MINUTE,$STUNDE,$TAGE,$MONAT,$JAHR),"\n"'
Day '' out of range 1..31 at -e line 1
Kennst Du diesen Fehler auch?
So funktionierts:
perl -MTime::Local -e 'print timelocal($SEKUNDE,$MINUTE,$STUNDE,14,$MONAT,$JAHR),"\n"'
947804400
export MINUTE=34
export TAGE=13
export MONAT=Jan
export JAHR=2007
perl -MTime::Local -e 'print timelocal($SEKUNDE,$MINUTE,$STUNDE,$TAGE,$MONAT,$JAHR),"\n"'
Day '' out of range 1..31 at -e line 1
Kennst Du diesen Fehler auch?
So funktionierts:
perl -MTime::Local -e 'print timelocal($SEKUNDE,$MINUTE,$STUNDE,14,$MONAT,$JAHR),"\n"'
947804400
Dein Problem sind die Singlequotes. Diese verhindern, dass die Shellvariablen in den Perlcode übernommen werden!
So geht es:
Bei deinem obigen Code sind die Parameter für timelocal in Perl alle undef, da Perl nur $SEKUNDE, $MINUTE usw. sieht und das in dem Fall dann alles undef ist
Deshalb mault er auch, dass der Tag außerhalb des Intervalls von 1 bis 31 ist
So geht es:
Code: Alles auswählen
export SEKUNDE=0
export STUNDE=14
export MINUTE=34
export TAGE=13
export MONAT=Jan
export JAHR=2007
perl -MTime::Local -e "print timelocal($SEKUNDE,$MINUTE,$STUNDE,$TAGE,$MONAT,$JAHR),\"\\n\""
Deshalb mault er auch, dass der Tag außerhalb des Intervalls von 1 bis 31 ist
der Monat sollte aber als Zahl übergeben werden.
Du könntest das aber auch ungefähr so lösen:
Das Hasharray für die Monate müßtest du dann aber auch noch entsprechend auffüllen
Du könntest das aber auch ungefähr so lösen:
Code: Alles auswählen
gms@gms4:~$ cat x.sh
DATE="13 Jan 2007 15:32:35"
perl -x $0 "$DATE"
exit 0
#################################################
#!/perl
#line 7
use Time::Local;
use POSIX qw(strftime);
my %m = ( "Jan", 0, "Feb", 1, "Mar", 2, "Apr", 3 );
foreach my $date ( @ARGV ) {
my @d = split(/[ :]+/,$date);
$d[1] = $m{ $d[1] };
$t = timelocal($d[5],$d[4],$d[3],$d[0],$d[1],$d[2]),"\n";
print strftime "%d %B %Y %H:%M:%S\n", localtime $t;
print "$t\n";
}
gms@gms4:~$ ./x.sh
13 Jänner 2007 15:32:35
1168698755