Jestem stara się owinąć wokół zdanie dlaczego te find
interpretuje plik czasy modyfikacji sposób to robi. W szczególności nie rozumiem, dlaczego -mtime +1
nie wyświetla plików starszych niż 48 godzin.
Jako przykładowy test stworzyłem trzy pliki testowe z różnymi zmodyfikowanymi datami:
[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 find z -mtime +1
przełącznikiem i uzyskałem następujące dane wyjściowe:
[root@foobox findtest]# find -mtime +1
./foo3
Następnie uruchomiłem find z -mmin +1440
i otrzymałem następujące dane wyjściowe:
[root@foobox findtest]# find -mmin +1440
./foo3
./foo2
Jeśli chodzi o stronę podręcznika wyszukiwania, 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.
Jednak nadal nie ma to 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 miał 1 dzień, 0 godzin, 0 minut i 0 sekund? W takim razie nie jest technicznie starszy niż 1 dzień i jest ignorowany?
Nie… nie… oblicza.
źródło
Odpowiedzi:
Cóż, prosta odpowiedź brzmi, jak sądzę, że twoja implementacja find jest zgodna ze standardem POSIX / SuS, co oznacza, że musi się tak zachowywać. Cytowanie z SUSv4 / IEEE Std 1003.1, wydanie 2013, „znajdź” :
(W innym miejscu tego dokumentu wyjaśniono, że
n
tak naprawdę może być+n
, i znaczenie tego jako „większe niż”).Dlaczego średnia mówi powinien zachowywać się w ten sposób, dobrze, to myślę, że długo w przeszłości programista leniwy albo nie myśleć o tym i po prostu napisał kod C
(current_time - file_time) / 86400
. A arytmetyka liczb całkowitych C odrzuca resztę. Skrypty zaczęły się w zależności od tego zachowania, dlatego zostały ujednolicone.Określone zachowanie będzie również przenośne w hipotetycznym systemie, w którym przechowywana jest tylko data modyfikacji (a nie godzina). Nie wiem, czy taki system istniał.
źródło
Argument to
-mtime
jest interpretowany jako liczba pełnych dni w wieku pliku.-mtime +n
oznacza zdecydowanie więcej niż ,-mtime -n
oznacza zdecydowanie mniej niż.Pamiętaj, że dzięki Bash możesz robić bardziej intuicyjne:
aby znaleźć pliki odpowiednio starsze i nowsze niż 24 godziny.
(Jest to również łatwiejsze niż wpisanie ułamkowego argumentu,
-mtime
gdy chcesz uzyskać rozdzielczość w godzinach lub minutach.)źródło
$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
$(())
jest zwykłą składnią arytmetyczną, nie jest specyficzna dla Bash, por. pubs.opengroup.org/onlinepubs/009695399/utilities/…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, np. Csh / tcsh./bin/sh
.Ułamkowe okresy 24-godzinne są skracane! Oznacza to, że „find -mtime +1” mówi o dopasowaniu plików zmodyfikowanych dwa lub więcej dni temu.
Poniższe może działać tylko na GNU?
źródło
Tak. Jak
man find
mówi „każda część ułamkowa jest ignorowana”. Jeśli podzielisz „1 dzień, 23 godziny, 59 minut i 59 sekund” na „24 godziny”, możesz otrzymać 1,9999, ale część .9999 zostanie następnie usunięta i nagle plik ma tylko 1 dzień.źródło
-mtime N
oznacza pliki, których wiek A w dniach spełnia N ≤ A < N +1. Innymi słowy, wybiera pliki, które były ostatnio modyfikowane między N a N +1 dni temu.-mtime N
-mtime -N
oznacza pliki, których wiek A spełnia A < N , tj. pliki zmodyfikowane mniej niż N dni temu. Mniej intuicyjnie oznacza pliki, których wiek A spełnia N +1 ≤ A , tj. Pliki zmodyfikowane co najmniej N +1 dni temu.-mtime +N
Na przykład
-mtime 1
wybiera pliki, które zostały zmodyfikowane od 1 do 2 dni temu.-mtime +1
wybiera pliki, które zostały zmodyfikowane co najmniej 2 dni temu. Aby zmodyfikować pliki co najmniej 1 dzień temu, użyj-mtime +0
.Opis „ostatnio zmodyfikowano n * 24 godziny temu” jest jedynie przybliżeniem i nie jest zbyt jasny.
Jeśli te reguły są trudne do zapamiętania, użyj pliku referencyjnego.
(Składnia „1 dzień temu” wymaga GNU
touch
.)źródło
find
!Użyj -mmin, -amin itp., Aby uzyskać dokładne wyniki
źródło
-?min
argumenty działają dokładnie tak samo jak-?time
argumenty z wyjątkiem kilku minut zamiast dni. Nie są też „dokładne”.Jeśli chcesz dokładnie 48 godzinach-stare pliki, a nie 2 dni, a następnie należy dodać
--daystart
wfind
komendzie. To ci pomoże.źródło
-daystart
(rozszerzenie GNU), nie--daystart
. Następnie-daystart
oznacza po prostu porównanie czasów z początkiem dzisiejszego dnia zamiast bieżącego, więc--daystart -mtime +1
zgłosiłbym pliki, które zostały zmodyfikowane więcej niż 48 godzin / 2 godziny przed początkiem dzisiejszego dnia, więc zazwyczaj pliki, które zostały zmodyfikowane ostro przed dniem wczorajszym .