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 +1
Bildschirm 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 +1
Schalter und bekam folgende Ausgabe:
[root@foobox findtest]# find -mtime +1
./foo3
Ich lief dann find mit -mmin +1440
und 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 +1
ignoriert 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 ....
quelle
Antworten:
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" :
(An anderer Stelle in diesem Dokument wird erklärt,
n
was 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.
quelle
Das Argument to
-mtime
wird als die Anzahl der ganzen Tage im Alter der Datei interpretiert .-mtime +n
bedeutet streng größer als ,-mtime -n
bedeutet streng kleiner als.Beachten Sie, dass Sie mit Bash noch intuitiver vorgehen können:
um Dateien zu finden, die älter als 24 Stunden sind.
(Es ist auch einfacher, als einen Bruchteil eines Arguments einzugeben,
-mtime
um die Auflösung in Stunden oder Minuten festzulegen.)quelle
$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
$(())
ist eine einfache Shell-arithmetische Syntax, sie ist nicht spezifisch für Bash, vgl. pubs.opengroup.org/onlinepubs/009695399/utilities/…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./bin/sh
.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.
Das Folgende funktioniert möglicherweise nur unter GNU?
quelle
Ja. Wie
man find
gesagt, "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.quelle
-mtime N
bedeutet Dateien, deren Alter A in Tagen N ≤ A < 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 -N
bedeutet , 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 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, 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.
(Die Syntax "vor 1 Tag" erfordert GNU
touch
.)quelle
find
!Verwenden Sie -mmin, -amin usw., um genaue Ergebnisse zu erhalten
quelle
-?min
Argumente funktionieren genauso wie die-?time
Argumente, außer mit Minuten anstelle von Tagen. Sie sind auch nicht „genau“.Wenn Sie genau 48 Stunden alte Dateien möchten, nicht 2 Tage, sollten Sie
--daystart
Ihrenfind
Befehl hinzufügen . Das wird dir helfen.quelle
-daystart
(eine GNU-Erweiterung), nicht--daystart
. Wenn Sie dann-daystart
nur die Zeiten mit dem Beginn des heutigen--daystart -mtime +1
Tages 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 .