Warum gibt find -mtime +1 nur Dateien zurück, die älter als 2 Tage sind?

117

Ich kämpfe darum, mich zu überlegen, warum die findÄnderungen an der Interprets-Datei so sind wie sie sind. Insbesondere verstehe ich nicht, warum auf dem -mtime +1Bildschirm keine Dateien angezeigt werden, die älter als 48 Stunden sind.

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

[root@foobox 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 lief dann find mit dem -mtime +1Schalter und bekam folgende Ausgabe:

[root@foobox findtest]# find -mtime +1
./foo3

Ich lief dann find mit -mmin +1440und bekam folgende Ausgabe:

[root@foobox findtest]# find -mmin +1440
./foo3
./foo2

Laut der Handbuchseite für find verstehe ich, dass dies ein 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 ergibt für mich immer noch keinen Sinn. Wenn eine Datei also 1 Tag, 23 Stunden, 59 Minuten und 59 Sekunden alt ist, find -mtime +1ignoriert sie das alles und behandelt sie einfach so, als ob sie 1 Tag, 0 Stunden, 0 Minuten und 0 Sekunden alt wäre? In welchem ​​Fall ist es nicht technisch älter als 1 Tag und wird ignoriert?

Berechnet ... nicht ....

Mike B
quelle
7
Anfangs schien es mir auch lustig, aber wenn man bedenkt, dass es ein Dateialter in ganzzahligen Tagen misst, dann tut es genau das, was man erwarten würde. Es werden keine Dateien ausgegeben, die 1 Tag alt sind. Eine Datei, die int (1,99) Tage alt ist, ist nicht> 1.
Octopus

Antworten:

87

Nun, die einfache Antwort ist, denke ich, dass Ihre Find-Implementierung dem POSIX / SuS-Standard folgt, der besagt, dass sie sich so verhalten muss. Aus SUSv4 / IEEE Std 1003.1, Ausgabe 2013, "find" :

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

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

In Bezug auf den Grund, warum der Standard besagt, dass er sich so verhalten soll - nun, ich würde vermuten, dass ein Programmierer in der Vergangenheit faul war oder nicht darüber nachdachte und einfach den C-Code schrieb (current_time - file_time) / 86400. C-Integer-Arithmetik verwirft den Rest. Abhängig von diesem Verhalten wurden Skripte gestartet und somit standardisiert.

Das spezifizierte Verhalten wäre auch auf ein hypothetisches System übertragbar, in dem nur ein Änderungsdatum (nicht die Uhrzeit) gespeichert ist. Ich weiß nicht, ob ein solches System existiert hat.

derobert
quelle
3
find wurde eindeutig nur für Aufräumarbeiten entwickelt.
Kjeld Flarup
84

Das Argument to -mtimewird als die Anzahl der ganzen Tage im Alter der Datei interpretiert . -mtime +nbedeutet streng größer als , -mtime -nbedeutet streng kleiner als.

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

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

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

(Es ist auch einfacher, als einen Bruchteil eines Arguments einzugeben, -mtimeum die Auflösung in Stunden oder Minuten festzulegen.)

Evgeni Sergeev
quelle
2
Um diese Dateien (nur regulär) in lesbaren Größen und in chronologischer Reihenfolge $ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
aufzulisten
1
Dies hat auch den gleichen Effekt, da beide Befehle zusammen die Dateien in diesem einminütigen Fenster vor 24 Stunden noch verfehlen.
Octopus,
1
$(())ist eine einfache Shell-arithmetische Syntax, sie ist nicht spezifisch für Bash, vgl. pubs.opengroup.org/onlinepubs/009695399/utilities/…
Josip Rodin
@JosipRodin Nein, nicht unbedingt wahr! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. Da Bash ein "erweitertes" SH ist, unterstützt es diese Syntax, einige andere Shells jedoch nicht, z. B. csh / tcsh.
t0r0X
@t0r0X mein punkt war, dass es kein bashismus ist, sondern in dash und zsh funktioniert und was auch immer sonst als konventionell dient /bin/sh.
Josip Rodin
45

Bruchteile von 24 Stunden werden abgeschnitten! Das bedeutet, dass "find -mtime +1" angibt, dass Dateien gefunden werden sollen, 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

Das Folgende funktioniert möglicherweise nur unter GNU?

find . -mmin +5 -mmin -10 # find files modified between
# 6 and 9 minutes ago
find / -mmin -10 # modified less than 10 minutes ago
Emir MurtaZa
quelle
Danke, ich habe versucht herauszufinden, warum -mtime X anders ist als -mtime + X
Donnerstag,
Ich nehme an, dass + X für (X + 1, X + 2, X + 3, ...) steht. :)
Eric Zheng
18

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?

Ja. Wie man findgesagt, "jeder 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 der 9999-Teil wird dann entfernt und die Datei ist plötzlich nur noch 1 Tag alt.

Martin von Wittich
quelle
18

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

-mtime -Nbedeutet , Dateien , deren Alter A erfüllt A < N , dh Dateien geändert weniger als N Tagen. Intuitiv weniger, bedeutet Dateien , deren Alter A erfüllt N + 1 ≤ A , dh Dateien mindestens modifizierten N vor 1 Tag.-mtime +N

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

Die Beschreibung „wurde zuletzt vor n * 24 Stunden geändert“ ist nur eine Annäherung und keine 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.)

Gilles
quelle
3
Schöne Erklärung, die ersten 3 Absätze sollten der Dokumentation von hinzugefügt werden find!
Melebius
4

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

Eran Ben-Natan
quelle
6
Die -?minArgumente funktionieren genauso wie die -?timeArgumente, außer mit Minuten anstelle von Tagen. Sie sind auch nicht „genau“.
Gilles
-2

Wenn Sie genau 48 Stunden alte Dateien möchten, nicht 2 Tage, sollten Sie --daystartIhren findBefehl hinzufügen . Das wird dir helfen.

find . type -f -daystart -mtime +1
Aravind Goud
quelle
5
Nein, zuerst ist es -daystart(eine GNU-Erweiterung), nicht --daystart. Wenn Sie dann -daystartnur die Zeiten mit dem Beginn des heutigen --daystart -mtime +1Tages anstelle der aktuellen Zeit vergleichen, werden Dateien gemeldet, die mehr als 48 Stunden vor dem Beginn des heutigen Tages geändert wurden. In der Regel werden Dateien, die vor dem Vortag stark geändert wurden .
Stéphane Chazelas