Warum funktioniert "find -mtime" bei Dateien mit unterschiedlichen Zeitzonen nicht wie erwartet?

7

Ich habe einige Dateien auf einem Server mit dem Datum vor einigen Monaten, aber sie sind für die find -mtime 7Suche unsichtbar .

Wenn ich sie mit ls -laufliste, sehen sie ganz normal aus:

-rw-r--r-- 1 root root    347253 Jun 12 16:26 pedia_main.2010-06-12-04-25-02.sql.gz
-rw-r--r-- 1 root root 490144578 Nov 24 16:26 gsmforum_main.2010-11-24-04-25-02.sql.gz

Die obere Datei ist für "find. -Mtime 1" nicht sichtbar, die untere ist jedoch sichtbar.

Ich schlug fast meinen Kopf gegen die Wand und versuchte zu verstehen warum. Ich habe einige zufällige Dinge ausprobiert und bin auf ls --full-timeBefehl gestoßen. Und es zeigt, dass diese beiden irgendwie ein bisschen anders sind

-rw-r--r-- 1 root root    347253 2010-06-12 16:26:20.000000000 +0400 pedia_main.2010-06-12-04-25-02.sql.gz
-rw-r--r-- 1 root root 490144578 2010-11-24 16:26:12.000000000 +0300 gsmforum_main.2010-11-24-04-25-02.sql.gz

Das Datum scheint in Ordnung zu sein. Bit eins hat +0400als Zeitzone und ein anderes ist +0300. Wie kommt findes, dass man die nicht findet +0400?

Das Betriebssystem ist CentOS 5.5 Final mit den neuesten Updates und die lsVersion ist (GNU coreutils) 5.97.

Außerdem verstehe ich nicht, wo diese "Zeitzone" der Datei gespeichert ist. Der Inode verfügt anscheinend über keine zusätzlichen Attribute zum Speichern. Das Dateisystem auf dem Server ist ext4 .

Vladislav Rastrusny
quelle
3
Der Unterschied im Zeitzonenversatz ist darauf zurückzuführen, dass ein Datum während der Sommerzeit für Ihre Zeitzone liegt und das andere nicht. Da sich UTC nicht verschiebt und Ihre Zeitzone dies tut, ändert sich der Versatz von UTC. Die Zeitzone wird nicht mit der Datei gespeichert. Der Offset wird berechnet, wenn der Verzeichniseintrag ausgegeben wird.
Bis auf weiteres angehalten.

Antworten:

17

Es ist möglich, dass das Problem der Zeitzone ein roter Hering ist.

find . -mtime 7

sollte Dateien finden, die genau sieben Tage alt sind ("sieben" bedeutet zwischen 7.000 und 7.999 Tage, Geben oder Nehmen und "alt" bedeutet "seit der letzten Änderung"). Wenn Sie Dateien möchten, die älter als sieben Tage sind, gemessen am Datum Ihrer ersten Datei (Juni 2010), versuchen Sie es

find . -mtime +7

Ich stimme Ihnen zu, dass die scheinbare Zeitzone seltsam ist, aber ich denke, dass sie erklärbar ist. man statEs ist klar, dass ein time_t gespeichert ist, wie Sean R unten sagt. Was dies lstut, ist, dies als Ortszeit anzuzeigen, und es ist so freundlich, dabei die lokalen Sommerzeitkonventionen zu berücksichtigen.

Mein System ist das gleiche: Dateizeiten, die zufällig von März bis Oktober fallen, werden mit einer Zeitzone von +0100 angezeigt, während diejenigen, die von Oktober bis März fallen, mit einer Zeitzone von +0000 angezeigt werden, nicht weil dies im Dateisystem gespeichert ist, sondern weil die Zeitzonendatei meinem System mitteilt, dass ich es im Juni, als ich die Datei berührte, zu einem Zeitpunkt getan hätte, von dem ich dachte, es wäre 8 Uhr morgens, nicht 7 Uhr morgens, wenn es Winter wäre. lsist so freundlich, wenn man Zeiten anzeigt, die zufällig im Sommer sind, um sie so zu zeigen, wie sie im Sommer erschienen wären, das ist alles.

Wenn Sie in Ihrer lsAusgabe Zeitzonen finden , die gemäß Ihrer örtlichen Konvention weder Sommer noch Winter sind, irre ich mich - aber ich kann keine auf meinem System finden.

MadHatter
quelle
Vielen Dank! Die Frage nach der Zeitzone ist jedoch immer noch interessant, da ich nicht sehe, wie die Zeitzoneneinstellungen in ext4 pro Datei gespeichert werden können.
Vladislav Rastrusny
Siehe meine geänderte Antwort oben.
MadHatter
3

Mit find funktioniert -mtime also in 24 Stunden

-mtime 0 or -mtime -1 mean today
-mtime 3 would mean 3 days old
-mtime +1 means greater than one day old 
-mtime -7 means less than 7 days old
user9517
quelle
Ich kenne. Eigentlich habe ich mtime 7Variante verwendet. Aber es funktioniert auch nicht, obwohl das Datum viel in der Vergangenheit liegt.
Vladislav Rastrusny
Um eine Suche zu finden, um Ihre ältere Datei anzuzeigen, müssten Sie eine +in Ihrer Zeitangabe haben, z. B. -mtime +7die alle Dateien findet, die älter als 7 Tage sind.
user9517
Dies ist ein Problem, das ich verstanden habe: -mtime +0 means greater than 24 hours ago -mtime +1 means greater than 24 hours + one day (48 hours ago) > find $ HOME -mtime 0 Suche nach Dateien in deinem Home-Verzeichnis, die in den letzten vierundzwanzig Stunden geändert wurden. Dieser Befehl funktioniert auf diese Weise, da die Zeit seit der letzten Änderung jeder Datei durch 24 Stunden geteilt wird und der Rest verworfen wird. Das bedeutet, dass eine Datei, um mit -mtime 0 übereinzustimmen, in der Vergangenheit geändert werden muss, was weniger als 24 Stunden her ist.
Tim Lum
2

Um den Zeitzonenanteil etwas näher zu erläutern (die "mtime" -Diskussion wird von anderen Kommentaren behandelt) ...

Datum und Uhrzeit werden seit dem 1. Januar 1970, UTC, um Mitternacht in Sekunden in Dateien gespeichert. Dies bedeutet, dass ihnen keine Zeitzone zugeordnet ist. Programme verwenden dann die Systemzeitzoneneinstellung in /etc/timezone, sofern diese nicht von der Umgebungsvariablen "TZ" überschrieben wird, um diese Zeit in der lokalen Zeitzone anzuzeigen:

chats:/tmp$ touch foo
chats:/tmp$ ls -l foo
-rw-r--r-- 1 jafo jafo 0 Dec  1 06:14 foo
chats:/tmp$ TZ=GMT ls -l foo
-rw-r--r-- 1 jafo jafo 0 Dec  1 13:14 foo
chats:/tmp$

Beachten Sie, dass in der letzten Zeile 13:14 Uhr und in der Ausgabe darüber, in der ich meine Standardzeitzone für die US-Bergzeit (GMT-0700) verwende, 6:14 Uhr angezeigt wird. Der Unterschied ist das zweite "ls", für das ich die Umgebungsvariable TZ auf GMT gesetzt habe.

Möglicherweise möchten Sie "stat" verwenden, um auch alle mit Dateien verknüpften Zeiten / Daten zu überprüfen.

Sean Reifschneider
quelle
Ich sehe immer noch nicht, wie dies ermöglicht, dass zwei verschiedene Dateien in derselben lsListe unterschiedliche Zeitzonendaten im mtime-Attribut haben.
Vladislav Rastrusny
1
Die FILES tun NICHT . Es sind die Benutzer, die die Zeitzonendaten haben. Alle Zeiten werden wie erwähnt gespeichert: Sekunden seit dem 1. Januar 1970 um Mitternacht.
Sean Reifschneider
Ich habe eine Antwort in einem anderen Forum - unterschiedliche GMTs sind auf unterschiedliche Dateidaten zurückzuführen. Im Juni ist es immer noch +3, im November wird es +4. Also auch hier keine Magie;) Danke.
Vladislav Rastrusny
1

Darüber hinaus verwende ich häufig Folgendes:

find -mtime -7 -daystart 

Das sagt find, um Dateien zu finden, die ab dem heutigen Tag bis zu (7 * 24) Stunden alt sind.

SmallClanger
quelle