Zeitstempel von file ermitteln [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Zeitstempel von file ermitteln [gelöst]

Beitrag von Duff » 17.08.2007 12:38:28

Hallo,

ich suche für ein Shell-Skript eine Möglichkeit, mit der ich den Zeitstempel einer Datei bestimmen kann (nicht ls -l) um diesen dann zu vergleichen. Da gab es doch einen Befehl zu, meine ich?

Danke.
Zuletzt geändert von Duff am 20.08.2007 10:44:36, insgesamt 1-mal geändert.
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 17.08.2007 12:52:50

vielleicht 'stat':

Code: Alles auswählen

root@gms4:~# touch FILENAME
root@gms4:~# stat -c '%y' FILENAME
2007-08-17 12:51:35.000000000 +0200
root@gms4:~# rm FILENAME
Gruß
gms

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 17.08.2007 13:12:26

Danke für die schnelle Antwort.

Doch leider gibt es wohl stat so nicht unter HP-UX.
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 17.08.2007 13:25:53

deshalb verwende ich gerne Perl als Posix-Layer:

Code: Alles auswählen

root@gms4:~# touch FILENAME
root@gms4:~# perl -e 'print ((stat($ARGV[0]))[9],"\n");' FILENAME
1187349778
root@gms4:~# perl -MPOSIX -e 'print (strftime("%Y-%m-%d %H:%M:%S",localtime((stat($ARGV[0]))[9])),"\n");' FILENAME
2007-08-17 13:22:58
root@gms4:~# rm FILENAME

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 17.08.2007 13:42:20

Danke.

Dann werde ich wohl doch in dem Shell-Skript auf einen Perl-Einzeiler zurückgreifen müssen, damit ich nachschauen kann, ob die entsprechende Datei zuletzt vor einer Stunde modifiziert wurde.
Oh, yeah!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 17.08.2007 14:00:45

Mit perl kann ich die aktuelle Zeit ja in Sekunden angeben:

Code: Alles auswählen

perl -e 'print time(),"\n";'
So dass ich dann den file mit

Code: Alles auswählen

perl -e 'print ((stat($ARGV[0]))[9],"\n");' file
auch in Sekunden ermitteln kann und dann die beiden Zeiten subtrahiere und das Ergebnis muss dann größer als 3600 sec sein.

Aber wie kann ich das print time() in perl unter unix mit date angeben?
Kann keine geeignete Option finden. Sollte doch auch gehen, oder?
Oh, yeah!

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 17.08.2007 14:19:14

Hi,
Duff hat geschrieben:Aber wie kann ich das print time() in perl unter unix mit date angeben?
tut mir leid, aber ich verstehe diese Frage nicht. Willst du den Output deines Perl Einzeilers als Input fuer date nutzen?
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
AK-Palme
Beiträge: 411
Registriert: 25.05.2004 15:38:30
Kontaktdaten:

Beitrag von AK-Palme » 17.08.2007 14:20:43

wenns dir nur darum geht könnte doch ein

Code: Alles auswählen

find file -ctime | wc -l
oder etwas in der richtung. Alternativ, du hast was von Referenztdatei gesagt den parameter -cnewer
Zuletzt geändert von AK-Palme am 17.08.2007 14:57:01, insgesamt 1-mal geändert.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 17.08.2007 14:32:04

roli hat geschrieben:Hi,
Duff hat geschrieben:Aber wie kann ich das print time() in perl unter unix mit date angeben?
tut mir leid, aber ich verstehe diese Frage nicht. Willst du den Output deines Perl Einzeilers als Input fuer date nutzen?
Da ich ein Shell-Skript habe, würde ich gerne date benutzen und nicht Variable=Perleinzeiler.
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 17.08.2007 17:36:45

habs noch immer nicht geschnallt
Duff hat geschrieben: auch in Sekunden ermitteln kann und dann die beiden Zeiten subtrahiere und das Ergebnis muss dann größer als 3600 sec sein.
du ermittelst also eine Zeitdifferenz und überprüfst ob diese größer als 3600 sec ist, soweit so gut

Code: Alles auswählen

gms1 ~ # touch -m -d "2007-08-16 11:15" file
gms1 ~ # perl -e 'print (time()-(stat($ARGV[0]))[9],"\n");' file
109131
wir habe jetzt also eine Datei die 109131 Sekunden alt ist, aber was willst du jetzt mit "date" anfangen. Die 109131 Sekunden sind ja keine Datumsangabe sondern eine Zeitdifferenz :?

umgerechnet in ein Datum kommt doch nichts vernünftiges raus:

Code: Alles auswählen

gms1 ~ # perl -MPOSIX -e 'print strftime("%Y-%m-%d %H:%M:%S",localtime( 109131 )),"\n";' file
1970-01-02 07:18:51
und das korrekte Datum haben wir ja bereits

Code: Alles auswählen

gms1 ~ # perl -MPOSIX -e 'print (strftime("%Y-%m-%d %H:%M:%S",localtime((stat($ARGV[0]))[9])),"\n");' file
2007-08-16 11:15:00

Gruß
gms

Sarem_Avuton
Beiträge: 546
Registriert: 16.12.2004 09:58:27
Wohnort: Leipzig

Beitrag von Sarem_Avuton » 17.08.2007 18:10:04

Hallo,

was ist denn mit

Code: Alles auswählen

database:~# date +%s -r testdatei
1187366536
?

Grüße Jörg

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 20.08.2007 10:44:20

Danke für die vielen Antworten.

Leider gibt es unter HP-UX die Option %s nicht. Aber ich denke dass ich das Problem nun trotzdem lösen kann.

Vielen Dank nochmals!
Oh, yeah!

Antworten