(gelöst) Datum der letzten Änderung in einer Datei

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
guennid

(gelöst) Datum der letzten Änderung in einer Datei

Beitrag von guennid » 18.01.2015 14:56:37

Ich benötige in einem DOS-Programm die Information, ob eine Textdatei inhaltlich verändert wurde. Das mache ich über dieses Linux-Kommando:

Code: Alles auswählen

stat [Dateiname1] | grep Modifiziert > dateiname2
. Mich da auf "Modifiziert" zu verlassen, erscheint mir etwas abenteuerlich. Die komplette Ausgabe in die Datei zu schreiben ginge zwar, aber dann wird die Auswertung etwas umständlich.

Gibt's andere Ideen?

Oder mal so gefragt: Kann man sich darauf verlassen, dass das Objekt der Begierde immer in der 6.Zeile der stat-Ausgabe steht?

Grüße, Günther
Zuletzt geändert von guennid am 19.01.2015 11:03:53, insgesamt 1-mal geändert.

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: Datum der letzten inhaltlichen Veränderung einer Datei

Beitrag von detix » 18.01.2015 21:14:27

Ich probiers mal... :)
Ja, im Grunde kannst du dich schon darauf verlassen dass das Objekt der Begierde immer in der 6.Zeile der stat-Ausgabe steht, aber warum?
Mit "find" ist es möglich sehr gezielt an die gewünschten Informationen zu kommen, Beispiele:

Code: Alles auswählen

stat /bin/bash
  Datei: „/bin/bash“
  Größe: 1029624        Blöcke: 2016       EA Block: 4096   reguläre Datei
Gerät: 807h/2055d       Inode: 52          Verknüpfungen: 1
Zugriff: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Zugriff    : 2015-01-18 08:14:23.766529375 +0100
Modifiziert: 2014-11-13 00:08:51.000000000 +0100
Geändert   : 2014-11-15 20:28:58.559657663 +0100
 Geburt    : -

## Ausgabe dieser Zeiten mit find und -printf in gleicher Reihenfolge:
find /bin/bash -printf '%a\n%t\n%c\n'
Sun Jan 18 08:14:23.0766529375 2015
Thu Nov 13 00:08:51.0000000000 2014
Sat Nov 15 20:28:58.0559657663 2014

## Auch das Ausgabeformat kann recht individuell eingestellt werden, zB Modifiziert als H:M:S:
find /bin/bash -printf '%TH:%TM:%TS\n'
00:08:51.0000000000

## Mit Variablen läßt sich gut arbeiten, hier mit '-' als Trennzeichen:
x=$(find /bin/bash -printf '%TH-%TM-%TS\n')
echo $x
00-08-51.0000000000
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Datum der letzten inhaltlichen Veränderung einer Datei

Beitrag von rendegast » 18.01.2015 22:05:43

Code: Alles auswählen

stat --printf="%y\n%Y\n" /bin/bash

Code: Alles auswählen

man stat
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: Datum der letzten inhaltlichen Veränderung einer Datei

Beitrag von detix » 18.01.2015 22:23:57

Wieso poste ich hier überhaupt noch? :D
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

uname
Beiträge: 12403
Registriert: 03.06.2008 09:33:02

Re: Datum der letzten inhaltlichen Veränderung einer Datei

Beitrag von uname » 19.01.2015 08:43:21

Das frage ich mich auch. Also die find-Variante finde ich viel schöner. Mal wieder etwas für meine Notizen.

Der Vollständigkeit halber mit ganzem Datum:

Code: Alles auswählen

find /pfad/zur/datei -printf '%TY-%Tm-%Td-%TH-%TM-%TS\n' (für zweistelliges Jahr %Ty anstatt von %TY)
Bei ganzen Ordnern soltle man zusätzlich noch den Dateinamen ausgeben. Ich trenne das dann immer gleich mit Semikolon, damit es meine Auswertetools einfacher haben.

Code: Alles auswählen

find . -type f -printf '%p; %TY-%Tm-%Td-%TH-%TM-%TS\n'
Gibt es eine Option, um die ganzen Nullen bei den Sekunden zu eleminieren?

guennid

Re: Datum der letzten inhaltlichen Veränderung einer Datei

Beitrag von guennid » 19.01.2015 09:44:47

Danke sehr, das hilft mir weiter!
Die konkrete Zeit will ich gar nicht wissen, ich will nur prüfen, ob zwischen zwei stat-Aufrufen Änderungen IN der Datei stattfanden.

Ich werde das hier

Code: Alles auswählen

x=$(find /bin/bash -printf '%TH-%TM-%TS\n')
mit dem hier

Code: Alles auswählen

stat --printf="%y\n%Y\n" /bin/bash
kombinieren.

In der manpage finde ich eine Unklarheit:

Code: Alles auswählen

%y     Menschenlesbare Zeit der letzten Änderung

Code: Alles auswählen

%z     Menschenlesbare Zeit der letzten Änderung
Gehe ich recht in der Annahme, dass sich %y auf Zeile 6 in der vollständigen stat-Ausgabe, die Zeit der letzten Änderung IN der Datei, bezieht, während sich %z auf Zeile 7 (die mich hier nicht interessiert) bezieht?

Unter der Voraussetzung, dass diese Annahme stimmt funktioniert wohl das hier

Code: Alles auswählen

x=$(stat --printf="%y" /bin/bash)
"\n" habe ich weggelassen. Wenn ich die manpage richtig lese, dann bewirkt dass einen Zeilenvorschub. In einer Variablen macht das doch wohl keinen Sinn -oder?
Ich liebe diese einfache, klare, selbsterklärende shellscript-Syntax! :evil:

Grüße, Günther

Frage an Sebstian/dieModeratoren:
Funktioniert das mit der automatischen Abmeldung erst nach einer Stunde noch zuverlässig? Ich bin mir ziemlich sicher, an der ersten Auflage dieses Beitrages weniger als eine Stunde gearbeitet zu haben. :evil:

uname
Beiträge: 12403
Registriert: 03.06.2008 09:33:02

Re: Datum der letzten inhaltlichen Veränderung einer Datei

Beitrag von uname » 19.01.2015 10:25:15

guennid hat geschrieben:Gehe ich recht in der Annahme, dass sich %y auf Zeile 6 in der vollständigen stat-Ausgabe, die Zeit der letzten Änderung IN der Datei, bezieht, während sich %z auf Zeile 7 (die mich hier nicht interessiert) bezieht?
Scheint laut Sourcecode (Debiancoreutils) so zu sein:

Code: Alles auswählen

          format = xasprintf ("%s%s", format, _("\
Access: %x\n\
Modify: %y\n\
Change: %z\n\
 Birth: %w\n\
"));

Code: Alles auswählen

...
  %y   Time of last modification, human-readable\n\
...
  %z   Time of last change, human-readable\n\
...

guennid

Re: Datum der letzten inhaltlichen Veränderung einer Datei

Beitrag von guennid » 19.01.2015 11:02:40

Prima, prima, prima.

Jetzt muss ich nur noch sehen, wie ich den Wert einer Linux-Variabeln einer DOS-Freepascal-Variablen zuweise. Vielleicht geht ja eine einfache Zuweisung. Mal schauen!

Grüße, Günther

Antworten