Staram się zrozumieć, dlaczego find
interpretuje plik czas modyfikacji jest taki sam jak to ma miejsce. W szczególności nie rozumiem, dlaczego -mtime +1
nie pokazuje plików starszych niż 48 godzin.
Jako przykład Utworzyłem trzy pliki testowe z różnymi datami modyfikacji:
[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
Następnie uruchomiłem znajdowanie z przełącznikiem -mtime +1
i otrzymałem następujące dane wyjściowe:
[root@foobox findtest]# find -mtime +1 ./foo3
Następnie uruchomiłem znajdowanie z -mmin +1440
i otrzymałem następujące dane wyjściowe:
[root@foobox findtest]# find -mmin +1440 ./foo3 ./foo2
Zgodnie ze stroną podręcznika find, rozumiem, że jest to oczekiwane zachowanie:
-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.
To nadal nie ma dla mnie sensu. Więc jeśli plik ma 1 dzień, 23 godziny, 59 minut i 59 sekund, find -mtime +1
ignoruje to wszystko i traktuje go tak, jakby był 1 dzień, 0 godzin, 0 minut , i 0 sekund? W którym przypadku nie jest technicznie starszy niż 1 dzień i został zignorowany?
Nie … nie … oblicza.
Komentarze
- Na początku też wydawało mi się to zabawne, ale jeśli weźmiesz pod uwagę, że mierzy on wiek plików w dniach całkowitych, to robi dokładnie czego ' oczekujesz. Wygrał ' nie dając plików mających 1 dzień. Plik, który ma int (1,99) dni, nie jest > 1.
- Pomyśl o tym, jak ludzie potocznie traktują wiek. Jeśli ktoś ma 79,9 lat, mówisz, że ma 79 lat. Jeśli więc szukasz człowieka w wieku powyżej 79 lat, to szukasz człowieka, który ma > 79,99999 lat, tj. > = 80 lat. Ludzie patrzą na wiek jako liczby całkowite i zaokrąglają w dół, a każdy wiek jako przedział.
Odpowiedź
Cóż , prosta odpowiedź brzmi, jak sądzę, że twoja implementacja find jest zgodna ze standardem POSIX / SuS, który mówi, że musi zachowywać się w ten sposób. Cytat z SUSv4 / IEEE Std 1003.1, wydanie 2013, „find” :
-mtime n
Wartość podstawowa będzie uznawana za prawdę, jeśli czas modyfikacji pliku odjęty
od czasu inicjalizacji podzielony przez 86400 (z odrzuconą resztą) wynosi n.
(W innym miejscu tego dokumentu wyjaśniono, że n
może faktycznie oznaczać +n
, a znaczenie tego jako „większe niż”).
Co do tego, dlaczego standard mówi, że powinien zachowywać się w ten sposób – cóż, myślę, że dawno temu programista był leniwy lub nie myślał o tym i po prostu napisał C code (current_time - file_time) / 86400
. arytmetyka liczb całkowitych w języku C odrzuca resztę. Skrypty uruchamiane w zależności od tego zachowania, więc zostało ustandaryzowane.
Specyfikację zachowania można również przenosić do hipotetycznego systemu, który przechowuje tylko datę modyfikacji (nie czas). Nie wiem, czy taki system istniał.
Komentarze
- find został wyraźnie zaprojektowany do wykonywania tylko zadań porządkowych.
Odpowiedź
Argument do -mtime
jest interpretowany jako liczba całe dni w wieku pliku. -mtime +n
oznacza ściśle większe niż , -mtime -n
oznacza ściśle mniej niż.
Zauważ, że z Bash możesz zrobić to bardziej intuicyjnie:
$ find . -mmin +$((60*24)) $ find . -mmin -$((60*24))
aby znaleźć pliki odpowiednio starsze i nowsze niż 24 godziny.
(Jest to również łatwiejsze niż wpisanie argumentu ułamkowego do -mtime
, gdy chcesz uzyskać rozdzielczość godzin lub minut.)
Komentarze
- Aby wyświetlić listę tych plików (tylko zwykłe) w rozmiarach czytelnych dla człowieka i w chr kolejność onologiczna, wykonaj
$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
- To również będzie miało taki sam efekt, że oba te polecenia łącznie nadal będą pomijać pliki w tym jednominutowym oknie 24 godziny temu .
-
$(())
to zwykła składnia arytmetyczna powłoki, ' nie jest specyficzna dla Bash, por. pubs.opengroup.org/onlinepubs/009695399/utilities/… - @JosipRodin Nie niekoniecznie prawda!
This chapter describes the syntax of that command language as it is used by the sh utility and [...]
. Ponieważ Bash jest ” rozszerzonym ” SH, obsługuje tę składnię, ale niektóre inne powłoki nie ' t, np csh / tcsh. - @ t0r0X chodziło mi o to, że ' nie jest bashizmem, raczej działa w myślniku i zsh i czymkolwiek innym służy jako konwencjonalny
/bin/sh
.
Odpowiedź
Ułamkowe okresy 24-godzinne są obcinane! Oznacza to, że „find -mtime +1” mówi, aby dopasować pliki zmodyfikowane dwa lub więcej dni temu.
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
Poniższe może działać tylko na GNU?
find . -mmin +5 -mmin -10 # find files modified between # 6 and 9 minutes ago find / -mmin -10 # modified less than 10 minutes ago
Komentarze
- Dzięki, próbowałem dowiedzieć się, dlaczego -mtime X różni się od -mtime + X
- Myślę, że + X oznacza szorty dla (X + 1, X + 2, X + 3, …). 🙂
- linki do wszystkich dokumentów źródłowych mylą prostą odpowiedź. Przykłady mają znaczenie. jego dobra dokumentacja. Zróbmy ich więcej! Podoba mi się ta odpowiedź
Odpowiedź
-mtime N
oznacza pliki, których wiek A w dniach spełnia N ≤ A < N + 1. Innymi słowy, -mtime N
wybiera pliki, które były ostatnio modyfikowane między N a N +1 dni temu.
-mtime -N
oznacza pliki, których wiek A spełnia wymagania A < N , czyli pliki zmodyfikowane mniej niż N dni temu. Mniej intuicyjnie -mtime +N
oznacza pliki, których wiek A spełnia N +1 ≤ A , tj. Pliki zmodyfikowano co najmniej N +1 dni temu.
Na przykład -mtime 1
wybiera pliki zmodyfikowane między 1 a 2 dniami temu. -mtime +1
wybiera pliki, które zostały zmodyfikowane co najmniej 2 dni temu. Aby pobrać pliki zmodyfikowane co najmniej 1 dzień temu, użyj -mtime +0
.
Opis „został ostatnio zmodyfikowany n * 24 godziny temu” jest tylko przybliżeniem, a nie bardzo jasny.
Jeśli te zasady są trudne do zapamiętania, użyj zamiast tego pliku referencyjnego.
touch -d "1 day ago" cutoff find . -newer cutoff
(Składnia „ 1 dzień temu ”wymaga GNU touch
.)
Komentarze
- Ładne wyjaśnienie, pierwsze 3 akapity należy dodać do dokumentacji
find
!
Odpowiedź
Więc jeśli plik ma 1 dzień, 23 godziny, 59 minut i 59 sekund, find -mtime +1 ignoruje to wszystko i traktuje go tak, jakby był 1 dzień , 0 godzin, 0 minut i 0 sekund?
Tak. Na przykład man find
mówi: „any część ułamkowa jest ignorowana ”. Jeśli podzielisz„ 1 dzień, 23 godziny, 59 minut i 59 sekund ”przez„ 24 godziny ”, możesz otrzymać 1,9999, ale t część .9999 jest następnie usuwana i nagle plik ma tylko 1 dzień.
Odpowiedź
Użyj -mmin, -amin itp., aby uzyskać dokładne wyniki
Komentarze
- Argumenty
-?min
działają dokładnie tak samo, jak-?time
z wyjątkiem minut zamiast dni. Nie są też ' t „dokładne”.
Odpowiedź
Jeśli chcesz mieć pliki sprzed dokładnie 48 godzin, a nie 2 dni, dodaj --daystart
do polecenia find
. To ci pomoże.
find . type -f -daystart -mtime +1
Komentarze
- Nie, najpierw ' s
-daystart
(rozszerzenie GNU), a nie--daystart
. Następnie-daystart
oznacza po prostu porównywanie czasów z początkiem dnia dzisiejszego zamiast z czasem bieżącym, więc--daystart -mtime +1
będzie zgłaszać pliki, które zostały zmodyfikowane więcej że 48h / 2 godziny przed początkiem dzisiejszego dnia, więc zazwyczaj pliki, które zostały ostro zmodyfikowane przed przedwczoraj.