Tegyük fel, hogy körülbelül 10 000 fájl van egy mappában. Óránkénti crontab segítségével kerestem meg az elmúlt 60 percben módosított fájlokat, majd dolgozzam fel őket. >

Tegyük fel, hogy az első fájlt 00: 00: 00-kor módosították, és 01: 00: 00-kor a “keresés” könnyen megtalálta.

Akkor tegyük fel, hogy a 10 000. fájlt is 00: 00: 00-kor módosították.

de most 01: 10-kor van : 00 és a “find” továbbra is keményen dolgozik a 10 000. fájl eléréséért.

Tehát most, 70 perc múlva, a “megtalálás” visszaadja a 10 000. 00:00:00 órakor módosított fájl?

Válasz

A GNU-ban find a kiértékeléshez használt referenciaidő a -mmin stb. fájlokkal rendelkező fájlokat kiszámítják és tárolják, amikor a kifejezést elemzik , tehát akkor érvényesek, amikor find elindul.

Ez azt jelenti, hogy minden ilyen idő-összehasonlítás ugyanazt az időreferenciát használja az összes kiértékelt fájlra, amikor find elemezte a parancssort.

Válasz

A GNU keresését feltételezve ez könnyen tesztelhető:

% 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 % 

Tehát annak ellenére, hogy a b -et utoljára legalább 4 perccel módosították find sleep 120 a a fájlhoz, még mindig egyezett.


Mivel -mmin nem “t POSIX, ez a megvalósításon múlik, de elvárnám a fentiekben látható viselkedést.

Megjegyzések

  • FW Az IW, a (FreeBSD-alapú?) find a Mac gépemen mindkét fájlt a find . -mmin 1 -exec sleep 120 \; -print

Válasz

Próbálja ki a következő parancsot egymás után két terminálon

1. terminál:

find /path -mmin -0.017 -printf "$(date) %Tc %p\n" | grep "/path/to/some/file" 

2. terminál:

touch -d " 0 seconds ago" /path/to/some/file 

az eredményt

A parancs kezdési idejét a keresési eredménnyel látom el. megmutatja, hogy find képes keresni azokat a fájlokat, amelyeket a parancs kezdési ideje után módosítottak.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük