Antag, jeg har cirka 10.000 filer i en mappe. Jeg har brugt crontab hver time til at finde filer, der er ændret i de sidste 60 minutter, så behandle det.

Påkald find -mmin -60 kl. 01:00:00

Antag, at den første fil blev ændret kl. 00:00:00 og let blev fundet af “find” kl. 01:00:00.

Antag derefter, at den 10.000. fil også blev ændret kl. 00:00:00

men er nu kl. 01:10 : 00 og “find” arbejder stadig hårdt på at nå den 10.000. fil

Så nu, 70 minutter senere, vil “find” returnere den 10.000. fil, der blev ændret kl. 00:00:00?

Svar

I GNU find, den referencetid, der bruges til at evaluere filer med -mmin osv. er beregnet og gemt, når udtrykket parses , så i virkeligheden når find starter.

Dette betyder, at alle sådanne tidssammenligninger bruger den samme tidsreference for alle evaluerede filer, det tidspunkt, hvor find analyseret kommandolinjen.

Svar

Under forudsætning af, at GNU finder, testes dette let:

% 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å selvom b sidst blev ændret mindst 4 minutter efter find løb sleep 120 for a matchede den stadig.


Da -mmin isn “t POSIX, dette er op til implementeringen, men jeg forventer den adfærd, der er set ovenfor.

Kommentarer

  • FW IW, den (FreeBSD-baserede?) find på min Mac viser også begge filer med find . -mmin 1 -exec sleep 120 \; -print

Svar

Prøv følgende kommando efter hinanden i to 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 er i stand til at få resultatet som

Wed Jul 17 11:48:33 IST 2019 Wed 17 Jul 2019 11:48:34 AM IST /path/to/some/file 

Jeg står foran starttidspunktet for kommandoen med find-resultatet. det viser, find er i stand til at søge efter de filer, der er ændret efter starttidspunktet for kommandoen.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *