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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *