Ich habe Mühe, mich um zu kümmern, warum die find -Datei interpretiert Änderungszeiten wie es ist. Insbesondere verstehe ich nicht, warum die -mtime +1 keine Dateien anzeigt, die weniger als 48 Stunden alt sind.

Als Beispieltest Ich habe drei Testdateien mit unterschiedlichen Änderungsdaten erstellt:

[[email protected] findtest]# ls -l total 0 -rw-r--r-- 1 root root 0 Sep 25 08:44 foo1 -rw-r--r-- 1 root root 0 Sep 24 08:14 foo2 -rw-r--r-- 1 root root 0 Sep 23 08:14 foo3 

Ich habe dann find mit dem Schalter -mtime +1 ausgeführt und habe die folgende Ausgabe:

[[email protected] findtest]# find -mtime +1 ./foo3 

Ich habe dann find mit der -mmin +1440 ausgeführt und die folgende Ausgabe erhalten:

[[email protected] findtest]# find -mmin +1440 ./foo3 ./foo2 

Gemäß der Manpage für find verstehe ich, dass dies erwartetes Verhalten ist:

 -mtime n File’s data was last modified n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretation of file modification times. -atime n File was last accessed n*24 hours ago. When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to have been accessed at least two days ago. 

Das macht für mich aber immer noch keinen Sinn. Wenn eine Datei also 1 Tag, 23 Stunden, 59 Minuten und 59 Sekunden alt ist, ignoriert find -mtime +1 all das und behandelt sie einfach so, als wäre sie 1 Tag, 0 Stunden, 0 Minuten und 0 Sekunden alt? In welchem Fall ist es an diesem Tag technisch nicht älter und wird ignoriert?

Berechnet … nicht ….

Kommentare

  • Anfangs schien es mir auch lustig, aber wenn man bedenkt, dass es das Alter einer Datei in ganzzahligen Tagen misst, dann tut es genau das was Sie ‚ erwarten würden. ‚ gibt keine Dateien aus, die 1 Tag alt sind. Eine Datei, die int (1,99) Tage alt ist, ist nicht > 1.
  • Denken Sie darüber nach, wie Menschen das Alter umgangssprachlich behandeln. Wenn jemand 79,9 Jahre alt ist, sagen Sie, dass er 79 Jahre alt ist. Wenn Sie also einen Menschen suchen, der älter als 79 Jahre ist, suchen Sie einen Menschen, der > 79,99999 Jahre alt ist, dh > = 80 Jahre alt. Die Leute betrachten das Alter als ganze Zahlen und runden es ab und sehen jedes Alter als einen Bereich.

Antwort

Nun Die einfache Antwort lautet, dass Ihre Find-Implementierung dem POSIX / SuS-Standard folgt, der besagt, dass sie sich so verhalten muss. Zitat aus SUSv4 / IEEE Std 1003.1, Ausgabe 2013, „find“ :

-mtime n
Der primäre Wert wird als wahr bewertet, wenn die von der Initialisierungszeit abgezogene Dateimodifikationszeit, geteilt durch 86400 (wobei der Rest verworfen wird), n beträgt.

(An anderer Stelle in diesem Dokument wird erklärt, dass n tatsächlich +n sein kann, und die Bedeutung davon als „größer als“).

Warum der Standard sagt, dass er sich so verhalten soll – nun, ich würde lange in der Vergangenheit vermuten, dass ein Programmierer faul war oder nicht darüber nachdachte und nur das C schrieb Code (current_time - file_time) / 86400. C-Integer-Arithmetik verwirft den Rest. Skripte wurden abhängig von diesem Verhalten gestartet und daher standardisiert.

Das spezifizierte Verhalten wäre auch portabel zu einem hypothetischen System, das nur ein Änderungsdatum (nicht eine Uhrzeit) gespeichert hat. Ich weiß nicht, ob es ein solches System gibt.

Kommentare

  • find wurde eindeutig nur für Bereinigungsjobs entwickelt.

Antwort

Das Argument für -mtime wird als Anzahl von ganze Tage im Alter der Datei. -mtime +n bedeutet streng größer als , -mtime -n bedeutet streng kleiner als.

Beachten Sie, dass Sie mit Bash intuitiver vorgehen können:

$ find . -mmin +$((60*24)) $ find . -mmin -$((60*24)) 

um Dateien zu finden, die älter bzw. neuer als 24 Stunden sind.

(Es ist auch einfacher, als ein Bruchargument in -mtime einzugeben, wenn Sie eine Auflösung wünschen Stunden oder Minuten.)

Kommentare

  • Zum Auflisten dieser Dateien (nur regulär) mit lesbaren Größen und in chr onologische Reihenfolge, führen Sie $ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
  • aus. Dies hat auch den gleichen Effekt, da beide Befehle zusammen die Dateien in diesem 1-Minuten-Fenster vor 24 Stunden noch verfehlen .
  • $(()) ist eine einfache Shell-Arithmetiksyntax. ‚ ist nicht spezifisch für Bash, vgl. pubs.opengroup.org/onlinepubs/009695399/utilities/…
  • @JosipRodin No. , nicht unbedingt wahr! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. Da Bash ein “ erweiterter “ SH ist, unterstützt es diese Syntax, aber einige andere Shells verwenden ‚ t, z csh / tcsh.
  • @ t0r0X Mein Punkt war, dass es ‚ kein Bashismus ist, sondern in Bindestrich und Zsh funktioniert und was auch immer sonst als konventionell dient /bin/sh.

Antwort

Bruchteile von 24 Stunden werden abgeschnitten! Das bedeutet, dass „find -mtime +1“ angibt, dass Dateien übereinstimmen, die vor zwei oder mehr Tagen geändert wurden.

find . -mtime +0 # find files modified greater than 24 hours ago find . -mtime 0 # find files modified between now and 1 day ago # (i.e., in the past 24 hours only) find . -mtime -1 # find files modified less than 1 day ago (SAME AS -mtime 0) find . -mtime 1 # find files modified between 24 and 48 hours ago find . -mtime +1 # find files modified more than 48 hours ago 

Folgendes funktioniert möglicherweise nur auf GNU?

find . -mmin +5 -mmin -10 # find files modified between # 6 and 9 minutes ago find / -mmin -10 # modified less than 10 minutes ago 

Kommentare

  • Danke, ich habe versucht herauszufinden, warum -mtime X anders ist als -mtime + X
  • Ich denke, dass + X Shorts für (X + 1, X + 2, X + 3, …) bedeutet. 🙂
  • Links zu allen Quelldokumenten verwirren die einfache Antwort. Beispiele sind wichtig. seine gute Dokumentation. Lass uns mehr davon machen! Ich mag diese Antwort

Antwort

-mtime N bedeutet Dateien, deren Alter A in Tagen erfüllt N A < N + 1. Mit anderen Worten, -mtime N wählt Dateien aus, die zuletzt vor 1 und N +1 Tagen geändert wurden.

-mtime -N bedeutet Dateien, deren Alter A A < erfüllt N , dh Dateien, die vor weniger als N Tagen geändert wurden. Weniger intuitiv bedeutet -mtime +N Dateien, deren Alter A N +1 ≤ A erfüllt, dh Dateien vor mindestens N +1 Tagen geändert.

Beispielsweise wählt -mtime 1 Dateien aus, die vor 1 bis 2 Tagen geändert wurden. -mtime +1 wählt Dateien aus, die vor mindestens 2 Tagen geändert wurden. Verwenden Sie -mtime +0, um Dateien vor mindestens einem Tag ändern zu lassen.

Die Beschreibung „wurde vor n * 24 Stunden zuletzt geändert“ ist nur eine Annäherung und nicht eine sehr klare.

Wenn Sie sich diese Regeln nur schwer merken können, verwenden Sie stattdessen eine Referenzdatei.

touch -d "1 day ago" cutoff find . -newer cutoff 

(Die Syntax “ Vor 1 Tag ”erfordert GNU touch.)

Kommentare

  • Schöne Erklärung, die ersten 3 Absätze sollte der Dokumentation von find hinzugefügt werden!

Antwort

Wenn eine Datei also 1 Tag, 23 Stunden, 59 Minuten und 59 Sekunden alt ist, ignoriert find -mtime +1 all das und behandelt sie einfach so, als wäre es 1 Tag , 0 Stunden, 0 Minuten und 0 Sekunden alt?

Ja. Wie man find sagt „any Bruchteil wird ignoriert „. Wenn Sie“ 1 Tag, 23 Stunden, 59 Minuten und 59 Sekunden „durch“ 24 Stunden „teilen, erhalten Sie möglicherweise 1,9999, aber t Der .9999-Teil wird dann entfernt und plötzlich ist die Datei nur noch 1 Tag alt.

Antwort

Verwenden Sie -mmin, -amin usw., um genaue Ergebnisse zu erhalten

Kommentare

  • Die Argumente -?min funktionieren genau wie die Argumente -?time Argumente außer mit Minuten anstelle von Tagen. Sie sind auch nicht ‚ t „genau“.

Antwort

Wenn Sie genau 48 Stunden alte Dateien möchten, nicht 2 Tage, sollten Sie --daystart in Ihren find -Befehl einfügen. Dies wird Ihnen helfen.

find . type -f -daystart -mtime +1 

Kommentare

  • Nein, zuerst ‚ s -daystart (eine GNU-Erweiterung), nicht --daystart. Dann bedeutet -daystart nur, die Zeiten mit dem Beginn von heute anstelle der aktuellen Zeit zu vergleichen, sodass --daystart -mtime +1 Dateien meldet, die stärker geändert wurden das 48h / 2 Stunden vor dem Beginn des Heute, also normalerweise Dateien, die vor dem Tag vor gestern stark geändert wurden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.