Jai du mal à comprendre pourquoi le fichier find
interprète plus précisément, je ne comprends pas pourquoi le -mtime +1
naffiche pas les fichiers datant de moins de 48 heures.
À titre dexemple de test Jai créé trois fichiers de test avec des dates modifiées différentes:
[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
Jai ensuite exécuté find avec le commutateur -mtime +1
et jai obtenu la sortie suivante:
[root@foobox findtest]# find -mtime +1 ./foo3
Jai ensuite exécuté find avec le -mmin +1440
et jai obtenu la sortie suivante:
[root@foobox findtest]# find -mmin +1440 ./foo3 ./foo2
Selon la page de manuel de find, je comprends que ce comportement est 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 na 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 simplement comme sil sagissait de 1 jour, 0 heure, 0 minute , et 0 seconde? Dans quel cas, il nest techniquement pas plus vieux que 1 jour et ignoré?
Ne … ne … calcule pas.
Commentaires
- Au début, cela me paraissait aussi drôle, mais quand on considère quil mesure lâge dun fichier en jours entiers, alors cest exactement le cas ce que vous ‘ attendez. Cela ne donnera ‘ que des fichiers datant de 1 jour. Un fichier vieux de int (1,99) jour nest pas > 1.
- Pensez à la façon dont les humains traitent lâge familièrement. Si quelquun a 79,9 ans, vous dites quil a 79 ans. Donc, si vous cherchez un humain de plus de 79 ans, alors vous recherchez un humain qui a > 79,99999 ans soit > = 80 ans. Les gens considèrent lâge comme des entiers et larrondissent et voient chaque âge comme une plage.
Réponse
Eh bien , la réponse simple est, je suppose, que votre implémentation find suit la norme POSIX / SuS, qui dit quelle doit se comporter de cette façon. Citant de SUSv4 / IEEE Std 1003.1, édition 2013, « find » :
-mtime n
Le primaire sera évalué comme vrai si lheure de modification du fichier soustraite
de lheure dinitialisation, divisée par 86400 (avec tout reste ignoré), 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 le standard dit quil doit se comporter de cette façon – eh bien, je suppose que depuis longtemps un programmeur était paresseux ou ny pensait pas, et écrivait simplement le C code (current_time - file_time) / 86400
. Larithmétique des nombres entiers C supprime le reste. Les scripts ont démarré en fonction de ce comportement et ont donc été normalisés.
Le comportement spec « d serait également portable à un système hypothétique qui stockait uniquement une date de modification (pas une heure). Je ne sais pas si un tel système a existé.
Commentaires
- find a été clairement conçu pour faire des tâches de nettoyage uniquement.
Réponse
Largument de -mtime
est interprété comme le nombre de jours entiers à lâge du fichier. -mtime +n
signifie strictement supérieur à , -mtime -n
signifie strictement moins de.
Notez quavec 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 de 24 heures, respectivement.
(Cest aussi plus facile que de taper un argument fractionnaire à -mtime
lorsque vous voulez une résolution dans heures ou minutes.)
Commentaires
- Pour lister ces fichiers (standard uniquement) avec des tailles lisibles par lhomme et en chr ordre onologique, faites
$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
- Cela aura également le même effet en ce que ces deux commandes ensemble manqueront toujours les fichiers dans cette fenêtre dune minute il y a 24 heures .
-
$(())
est une syntaxe arithmétique simple, elle ‘ nest pas spécifique à Bash, cf. pubs.opengroup.org/onlinepubs/009695399/utilities/… - @JosipRodin Non , pas forcément vrai!
This chapter describes the syntax of that command language as it is used by the sh utility and [...]
. Puisque Bash est un » étendu » SH, il prend en charge cette syntaxe, mais certains autres shells ne ‘ t, par exemple csh / tcsh. - @ t0r0X mon point était que ce ‘ nest pas un bashisme, mais fonctionne en dash et zsh et tout ce qui sert de conventionnel
/bin/sh
.
Réponse
Les périodes fractionnaires de 24 heures sont tronquées! Cela signifie que «find -mtime +1» dit 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
Ce qui suit ne peut fonctionner que 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
Commentaires
- Merci, jessayais de comprendre pourquoi -mtime X était différent de -mtime + X
- Je suppose que + X signifie un short pour (X + 1, X + 2, X + 3, …). 🙂
- les liens vers tous les documents sources confondent la réponse simple. Les exemples comptent. sa bonne documentation. Faisons plus dentre eux! Jaime cette réponse
Réponse
-mtime N
signifie des fichiers dont lâge A en jours satisfait N ≤ A < N + 1. En dautres termes, -mtime N
sélectionne les fichiers qui ont été modifiés pour la dernière fois entre N et N 1 jour.
-mtime -N
signifie des fichiers dont lâge A satisfait A < N , cest-à-dire les fichiers modifiés il y a moins de N jours. Moins intuitivement, -mtime +N
désigne les fichiers dont lâge A satisfait N +1 ≤ A , cest-à-dire les fichiers modifié il y a au moins N +1 jour.
Par exemple, -mtime 1
sélectionne les fichiers qui ont été modifiés il y a entre 1 et 2 jours. -mtime +1
sélectionne les fichiers qui ont été 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 » nest quune approximation, et non une 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
.)
Commentaires
- Belle explication, les 3 premiers paragraphes doit être ajouté à la documentation de
find
!
Answer
Donc, si un fichier a 1 jour, 23 heures, 59 minutes et 59 secondes, find -mtime +1 ignore tout cela et le traite comme si cétait 1 jour , 0 heure, 0 minute et 0 seconde?
Oui. Comme man find
dit, « tout la 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 t La partie .9999 est alors supprimée et tout à coup le fichier na que 1 jour.
Réponse
Utilisez -mmin, -amin , etc pour obtenir des résultats exacts
Commentaires
- Les arguments
-?min
fonctionnent exactement comme le-?time
arguments sauf avec des minutes au lieu de jours. Ils ne sont pas ‘ t « exacts » non plus.
Réponse
Si vous voulez des fichiers datant exactement de 48 heures et non de 2 jours, vous devez ajouter --daystart
dans votre commande find
. Cela vous aidera.
find . type -f -daystart -mtime +1
Commentaires
- Non, dabord ‘ s
-daystart
(une extension GNU), pas--daystart
. Ensuite,-daystart
signifie simplement comparer les heures avec le début daujourdhui au lieu de lheure actuelle, donc--daystart -mtime +1
signalerait les fichiers qui ont été modifiés davantage que 48h / 2 heures avant le début de la journée daujourdhui, donc généralement des fichiers qui ont été modifiés brusquement avant-hier.