web-dev-qa-db-fra.com

Pourquoi find -mtime +1 ne renvoie-t-il que les fichiers de plus de 2 jours?

J'ai du mal à me faire une idée pourquoi le find interprète la modification du fichier comme il le fait. Plus précisément, je ne comprends pas pourquoi le -mtime +1 n'affiche pas les fichiers de moins de 48 heures.

À titre d'exemple de test, j'ai créé trois fichiers de test avec différentes dates modifiées:

[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

J'ai ensuite exécuté find avec le -mtime +1 switch et a obtenu la sortie suivante:

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

J'ai ensuite exécuté find avec le -mmin +1440 et a obtenu la sortie suivante:

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

Selon la page de manuel de find, je comprends que c'est un comportement attendu:

 -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.

Cela n'a toujours pas de sens pour moi. Donc, si un fichier a 1 jour, 23 heures, 59 minutes et 59 secondes, find -mtime +1 ignore tout cela et le traite comme s'il avait 1 jour, 0 heure, 0 minute et 0 seconde? Dans ce cas, il n'est pas techniquement plus ancien que 1 jour et ignoré?

Ne ... ne calcule pas.

127
Mike B

Eh bien, la réponse simple est, je suppose, que votre implémentation find suit la norme POSIX/SuS, qui dit qu'elle doit se comporter de cette façon. Citant de SUSv4/IEEE Std 1003.1, 2013 Edition, "find" :

-mtime n
Le primaire doit être évalué comme vrai si le temps de modification du fichier est soustrait
Du temps d'initialisation, divisé par 86400 (avec tout reste rejeté), est n.

(Ailleurs dans ce document, il explique que n peut en fait être +n, et la signification de cela comme "supérieur à").

Quant à savoir pourquoi la norme dit qu'elle doit se comporter de cette façon — eh bien, je suppose que dans le passé, un programmeur était paresseux ou n'y pensait pas, et vient d'écrire le code C (current_time - file_time) / 86400. L'arithmétique entière C élimine le reste. Les scripts ont commencé en fonction de ce comportement et ont donc été standardisés.

Le comportement spécifié serait également portable pour un système hypothétique qui ne stockait qu'une date de modification (pas une heure). Je ne sais pas si un tel système a existé.

92
derobert

L'argument de -mtime est interprété comme le nombre de jours entiers dans l'âge du fichier. -mtime +n signifie strictement supérieur à, -mtime -n signifie strictement inférieur à.

Notez qu'avec Bash, vous pouvez faire le plus intuitif:

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

pour rechercher des fichiers plus anciens et plus récents que 24 heures, respectivement.

(C'est aussi plus simple que de taper un argument fractionnaire sur -mtime lorsque vous souhaitez une résolution en heures ou en minutes.)

93
Evgeni Sergeev

Des périodes fractionnées de 24 heures sont tronquées! Cela signifie que "find -mtime +1" indique de faire correspondre les fichiers modifiés il y a deux jours ou plus.

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

Les éléments suivants peuvent uniquement fonctionner sur GNU?

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

-mtime N signifie des fichiers dont l'âge A en jours satisfait N A < N + 1. En d'autres termes, -mtime N sélectionne les derniers fichiers modifiés entre N et N + il y a 1 jours .

-mtime -N signifie des fichiers dont l'âge A satisfait A < N , c'est-à-dire des fichiers modifiés il y a moins de N jours. Moins intuitivement, -mtime +N signifie des fichiers dont l'âge A satisfait N + 1 ≤ A , c'est-à-dire des fichiers modifiés au moins N + il y a 1 jours.

Par exemple, -mtime 1 sélectionne les fichiers modifiés entre 1 et 2 jours auparavant. -mtime +1 sélectionne les fichiers modifiés il y a au moins 2 jours. Pour obtenir des fichiers modifiés il y a au moins 1 jour, utilisez -mtime +0.

La description "a été modifiée pour la dernière fois il y a n * 24 heures" n'est qu'une approximation, et pas très claire.

Si vous trouvez ces règles difficiles à retenir, utilisez plutôt un fichier de référence.

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

(La syntaxe "il y a 1 jour" nécessite GNU touch.)

Donc, si un fichier a 1 jour, 23 heures, 59 minutes et 59 secondes, trouver -mtime +1 ignore tout cela et le traite comme s'il avait 1 jour, 0 heure, 0 minute et 0 seconde?

Oui. Comme man find dit, "toute partie fractionnaire est ignorée". Si vous divisez "1 jour, 23 heures, 59 minutes et 59 secondes" par "24 heures", vous pouvez obtenir 1,9999, mais la partie .9999 est ensuite supprimée et soudainement, le fichier a seulement 1 jour.

19
Martin von Wittich

Utilisez -mmin, -amin, etc. pour obtenir des résultats exacts

4
Eran Ben-Natan