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.
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é.
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.)
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
-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.
Utilisez -mmin, -amin, etc. pour obtenir des résultats exacts