Ik “heb moeite om mijn gedachten rond waarom het find
bestand te interpreteren wijzigingstijden zoals het doet. In het bijzonder begrijp ik niet waarom de -mtime +1
geen bestanden laat zien die minder dan 48 uur oud zijn.
Als voorbeeldtest Ik heb drie testbestanden gemaakt met verschillende gewijzigde datums:
[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
Ik heb toen find uitgevoerd met de -mtime +1
schakelaar en kreeg de volgende uitvoer:
[root@foobox findtest]# find -mtime +1 ./foo3
Ik heb toen find uitgevoerd met de -mmin +1440
en kreeg de volgende uitvoer:
[root@foobox findtest]# find -mmin +1440 ./foo3 ./foo2
Volgens de man-pagina voor find, ik begrijp dat dit verwacht gedrag is:
-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.
Dit klopt echter nog steeds niet. Dus als een bestand 1 dag, 23 uur, 59 minuten en 59 seconden oud is, negeert find -mtime +1
dat allemaal en behandelt het gewoon alsof het 1 dag, 0 uur, 0 minuten is , en 0 seconden oud? In welk geval is het technisch niet ouder die 1 dag en wordt het genegeerd?
Berekent … niet …
Reacties
- In eerste instantie leek het mij ook grappig, maar als je bedenkt dat het de leeftijd van een bestand meet in hele dagen, dan doet het dat precies wat je ‘ zou verwachten. Het zal ‘ geen bestanden opleveren die gelijk zijn aan 1 dag oud. Een bestand dat int (1.99) dagen oud is, is niet > 1.
- Bedenk hoe mensen in de volksmond omgaan met leeftijd. Als iemand 79,9 jaar oud is, zeg je dat ze 79 jaar oud zijn. Dus als u op zoek bent naar een mens ouder dan 79 jaar, dan zoekt u een mens die > 79,99999 jaar oud is, dwz > = 80 jaar oud. Mensen beschouwen leeftijd als gehele getallen en ronden het naar beneden af en zien elke leeftijd als een bereik.
Antwoord
Nou , het simpele antwoord is, denk ik, dat je vind-implementatie de POSIX / SuS-standaard volgt, die zegt dat het zich op deze manier moet gedragen. Citaat uit SUSv4 / IEEE Std 1003.1, editie 2013, “find” :
-mtime n
De primaire zal evalueren als waar als de bestandswijzigingstijd die
wordt afgetrokken van de initialisatietijd, gedeeld door 86400 (waarbij de rest wordt weggegooid), n is.
(Elders in dat document wordt uitgelegd dat n
feitelijk +n
kan zijn, en de betekenis daarvan als “groter dan”).
Wat betreft waarom de standaard zegt dat het zich zo zal gedragen – wel, ik denk dat lang in het verleden een programmeur lui was of er niet aan dacht, en zojuist de C schreef code (current_time - file_time) / 86400
. C integer rekenkunde verwijdert de rest. Scripts begonnen afhankelijk van dat gedrag, en dus werd het gestandaardiseerd.
Het specifieke gedrag zou ook draagbaar zijn naar een hypothetisch systeem dat alleen een wijzigingsdatum opsloeg (niet de tijd). Ik weet niet of een dergelijk systeem bestaat.
Reacties
- vondst was duidelijk ontworpen om alleen opruimwerkzaamheden uit te voeren.
Antwoord
Het argument voor -mtime
wordt geïnterpreteerd als het aantal hele dagen in de leeftijd van het bestand. -mtime +n
betekent strikt groter dan , -mtime -n
betekent strikt minder dan.
Merk op dat je met Bash het meer intuïtieve kunt doen:
$ find . -mmin +$((60*24)) $ find . -mmin -$((60*24))
om bestanden te vinden die respectievelijk ouder en nieuwer zijn dan 24 uur.
(Het is ook gemakkelijker dan een fractioneel argument in te voeren voor -mtime
voor wanneer u een oplossing wilt in uren of minuten.)
Reacties
- Om die bestanden (alleen normaal) weer te geven met leesbare formaten en in chr onologische volgorde, doe
$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
- Dit heeft ook hetzelfde effect omdat beide commandos samen 24 uur geleden nog steeds de bestanden in dat ene minuutvenster missen .
-
$(())
is een gewone rekenkundige syntaxis van de shell, het ‘ is niet specifiek voor Bash, cf. pubs.opengroup.org/onlinepubs/009695399/utilities/… - @JosipRodin Nee , niet noodzakelijk waar!
This chapter describes the syntax of that command language as it is used by the sh utility and [...]
. Aangezien Bash een ” uitgebreide ” SH is, ondersteunt het deze syntaxis, maar sommige andere shells gebruiken ‘ t, bijv csh / tcsh. - @ t0r0X mijn punt was dat het ‘ geen bashisme is, het werkt eerder in streepjes en zsh en al het andere dient als een conventionele
/bin/sh
.
Antwoord
Gebroken perioden van 24 uur worden ingekort! Dat betekent dat “find -mtime +1” zegt om overeen te komen met bestanden die twee of meer dagen geleden zijn gewijzigd.
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
Het volgende werkt mogelijk alleen op GNU?
find . -mmin +5 -mmin -10 # find files modified between # 6 and 9 minutes ago find / -mmin -10 # modified less than 10 minutes ago
Reacties
- Bedankt, ik probeerde erachter te komen waarom -mtime X anders was dan -mtime + X
- Ik denk dat + X korte broek betekent voor (X + 1, X + 2, X + 3, …). 🙂
- links naar alle brondocumenten verwarren het simpele antwoord. Voorbeelden zijn belangrijk. zijn goede documentatie. Laten we er meer doen! Ik vind dit antwoord leuk
Antwoord
-mtime N
betekent bestanden waarvan leeftijd A in dagen voldoet aan N ≤ A < N + 1. Met andere woorden, -mtime N
selecteert bestanden die het laatst zijn gewijzigd tussen N en N +1 dagen geleden.
-mtime -N
betekent bestanden waarvan de leeftijd A voldoet aan A < N , dwz bestanden die minder dan N dagen geleden zijn gewijzigd. Minder intuïtief betekent -mtime +N
bestanden waarvan de leeftijd A voldoet aan N +1 ≤ A , dwz bestanden gewijzigd ten minste N +1 dagen geleden.
Bijvoorbeeld, -mtime 1
selecteert bestanden die tussen 1 en 2 dagen geleden zijn gewijzigd. -mtime +1
selecteert bestanden die minstens 2 dagen geleden zijn gewijzigd. Gebruik -mtime +0
om bestanden ten minste 1 dag geleden gewijzigd te krijgen.
De beschrijving “is voor het laatst gewijzigd n * 24 uur geleden” is slechts een benadering, en niet een heel duidelijke.
Als je deze regels moeilijk te onthouden vindt, gebruik dan een referentiebestand.
touch -d "1 day ago" cutoff find . -newer cutoff
(De syntaxis ” 1 dag geleden ”vereist GNU touch
.)
Reacties
- Leuke uitleg, de eerste 3 alineas moet worden toegevoegd aan de documentatie van
find
!
Answer
Dus als een bestand 1 dag, 23 uur, 59 minuten en 59 seconden oud is, negeert find -mtime +1 dat allemaal en behandelt het gewoon alsof het 1 dag is , 0 uur, 0 minuten en 0 seconden oud?
Ja. Zoals man find
zegt: “any fractionele deel wordt genegeerd “. Als u” 1 dag, 23 uur, 59 minuten en 59 seconden “door” 24 uur “deelt, krijgt u mogelijk 1.9999, maar t hij .9999-deel wordt dan gestript en plotseling is het bestand slechts 1 dag oud.
Answer
Gebruik -mmin, -amin , etc om exacte resultaten te krijgen
Opmerkingen
- De
-?min
argumenten werken precies zoals de-?time
argumenten behalve met minuten in plaats van dagen. Ze zijn ook niet ‘ t “exact”.
Antwoord
Als je exact 48 uur oude bestanden wilt, niet 2 dagen, dan moet je --daystart
toevoegen aan je find
commando. Dit zal je helpen.
find . type -f -daystart -mtime +1
Reacties
- Nee, eerst ‘ s
-daystart
(een GNU-extensie), niet--daystart
. Dan betekent-daystart
gewoon tijden vergelijken met het begin van vandaag in plaats van de huidige tijd, dus--daystart -mtime +1
zou meer gewijzigde bestanden rapporteren die 48 uur / 2 uur voor het begin van de dag, dus meestal bestanden die vóór eergisteren sterk gewijzigd zijn.