Znajdź pliki nowsze niż 15 sekund, ale starsze niż 2 sekundy

17

Chcę znaleźć pliki nowsze niż 15 sekund, ale starsze niż 2 sekundy. Oto skrypt, którego obecnie używam, który pobiera pliki nowsze niż 15 sekund:

find /my/directory -name '*.jpg' -not -newermt '-15 seconds'

Każda pomoc jest mile widziana

Yllier123
źródło
2
Jakiego systemu operacyjnego używasz? Istnieją różnice we findwdrożeniach.
terdon
Czy plik zmodyfikowany dokładnie 2 sekundy temu powinien pasować? Co z plikiem zmodyfikowanym dokładnie 15 sekund temu?
Mikel
Masz więcej niż 2 sekundy w momencie rozpoczęcia lub zakończenia skryptu?
Stéphane Chazelas,
@Mikel, prawdopodobnie nie ma to znaczenia, ponieważ obecnie zegary mają rozdzielczość nanosekundową.
Stéphane Chazelas,
1
Ok ... skoro nikt inny nie pyta ... @ Yllier123 dlaczego potrzebujesz znaleźć pliki utworzone między 2 <x <15 sekund? Jestem po prostu ciekawy.
C Bauer,

Odpowiedzi:

17

Możesz łączyć wiele predykatów, łącząc je w łańcuchy.

Nie ma -oldermt, ale możesz to napisać jako -not -newermt.

Chcesz:

  • -newermt '-15 seconds' powiedzieć, że plik ma mniej niż 15 sekund, oraz
  • -not -newermt '-2 seconds' że plik ma więcej niż 2 sekundy

Próbować:

find /my/directory -newermt '-15 seconds' -not -newermt '-2 seconds'

Lub, aby być zgodnym z POSIX:

find /my/directory -newermt '-15 seconds' \! -newermt '-2 seconds'

Ponadto, abyś ty (i inni czytelnicy) byli świadomi, że „nowszy” oznacza zmodyfikowany niedawno, a nie utworzony niedawno.

Mikel
źródło
3
Ładny. Pamiętaj, że -not -newermt '-2 seconds'dopasuje również pliki dokładnie w wieku 2 sekund. Użyj, -not -newermt '3 seconds'aby je również wykluczyć.
terdon
1
Tak, skrzynie zawsze są zabawne. Nie jestem pewien, jakiej rozdzielczości używa do tych porównań. Zakładam, że wszystko, co zostało zmodyfikowane ~ 2.000000001 sekund temu, jest zgodne, ale zależy to również od systemu plików i systemu operacyjnego.
Mikel
Dobra uwaga, nie mam pojęcia, jaka jest rozdzielczość. Właśnie przetestowałem touch -d "2 seconds ago" file; find . -newermt '-15 seconds' -not -newermt '-2 seconds'i dostałem file.
terdon
@terdon Cóż, to zależy od tego, czy znaczniki czasu mają rozdzielczość dokładniejszą niż jedna sekunda; która zależy od systemu, systemu plików, a nawet może się różnić pomiędzy plikami na tym samym systemie plików, jeśli jest stosowany przez wielu różnych maszynach.
Blacklight Shining
„nowszy” oznacza „nowszy niż”. To „m” oznacza „zmodyfikowany”.
OrangeDog
4

Nie wspomniałeś o swoim systemie operacyjnym ....

Działa to dobrze z nowoczesną implementacją find, taką jak ta z FreeBSD lub z sfind.

find /my/directory -name '*.jpg' -mtime -15s -mtime +2s

Sfind jest częścią narzędzi Schily: http://sourceforge.net/projects/schilytools/files/

OSTRZEŻENIE: Właśnie odkryłem problem sfind. Jeśli -mtimeargumenty są mniejsze niż 60s, nie będzie działać poprawnie, ponieważ czasy plików są obecnie porównywane ze znacznikiem czasu 60 sekund w przyszłości, który pierwotnie był obliczany dla zmiany roku -ls.

BTW: -notnie należy find, to nieprzenośny GNUism.

schily
źródło
1
Jest bashtag… Więc środowiskiem może być Cygwin, Debian GNU / Hurd, bashdziałający na FreeBSD lub Solaris,… ;-)
phk
Dla GNU findwydaje się, że dziesiętne, choć szalone, mogą być użyte jako obejście.
Arthur2e5
Funkcja POSIX find ma !opcję -not as! expression . Więc nic wielkiego.
@phk Dlatego wspomniałem o metodzie, która działa z ulepszonym standardem primaryod, findaby poinformować ludzi, że nie trzeba zawsze dodawać nowych, primariesaby znaleźć możliwość zwiększenia funkcjonalności. BTW: Naprawiono libfindopublikowano w schily tools.
schily
@BinaryZebra problem polega na tym, że w gfindogóle dodano -notalias. Nigdy nie był potrzebny, a jego obecność można postrzegać jako blokadę strategii dla dostawcy.
schily