Antag att jag har ungefär 10 000 filer i en mapp. Jag har använt crontab varje timme för att hitta filer som har ändrats under de senaste 60 minuterna och sedan bearbeta det.
Åkalla find -mmin -60
kl 01:00:00
Antag att den första filen ändrades kl 00:00:00 och hittades lätt av ”hitta” kl 01:00:00.
Antag sedan att den 10 000: e filen också ändrades kl 00:00:00
men är nu kl 01:10 : 00 och ”find” arbetar fortfarande hårt för att nå den 10 000: e filen
Så nu, efter 70 minuter, kommer ”hitta” att returnera den 10 000: e fil som ändrades 00:00:00?
Svar
I GNU find
, referenstiden som används för att utvärdera filer med -mmin
etc. är beräknas och lagras när uttrycket tolkas , så i själva verket när find
startar.
Detta betyder att alla sådana jämförelser använder samma tidsreferens för alla utvärderade filer, den tid då find
tolkade kommandoraden.
Svar
Förutsatt att GNU-sökning är det lätt att testa:
% mkdir foo; cd foo; touch a b % find -mmin 1 . ./a ./b % find -mmin 1 -exec sleep 120 \; -print . # 2 minutes wait before this showed up ./a # another 2 minutes before this showed up ./b # and another 2 minutes for this one % find -mmin 1 %
Så även om b
senast ändrades minst 4 minuter efter att find
sprang sleep 120
för a
matchade det fortfarande.
Eftersom -mmin
isn ”t POSIX, det här är upp till implementeringen, men jag förväntar mig beteendet ovan.
Kommentarer
- FW IW, (FreeBSD-baserad?)
find
på min Mac visar också båda filerna medfind . -mmin 1 -exec sleep 120 \; -print
Svar
Försök med följande kommando efter varandra i två terminaler
Terminal 1:
find /path -mmin -0.017 -printf "$(date) %Tc %p\n" | grep "/path/to/some/file"
Terminal 2:
touch -d " 0 seconds ago" /path/to/some/file
vi kan få resultatet som
Wed Jul 17 11:48:33 IST 2019 Wed 17 Jul 2019 11:48:34 AM IST /path/to/some/file
Jag prefixerar starttiden för kommandot med sökresultat. det visar att find
kan söka efter filerna som ändras efter kommandot starttid.