Pytanie jak mogę sprawdzić, czy plik został utworzony ponad x czas temu?


Chcę sprawdzić w linuxie, czy plik został utworzony ponad x czas temu.

załóżmy, że plik nazywa się text.txt, a czas wynosi 2 godziny.

 if [ what? ]
 then
     echo "old enough"
 fi

76
2018-02-16 09:25


pochodzenie




Odpowiedzi:


Tylko do czasu modyfikacji

if test `find "text.txt" -mmin +120`
then
    echo old enough
fi

Lub to samo w jednym wierszu:

#!/bin/bash
find text.txt -mmin +120 -exec echo "old enough" \;

Możesz użyć -cmin do zmiany lub -amin dla czasu dostępu. Jak zauważyli inni, nie sądzę, abyś mógł śledzić czas tworzenia.


103
2018-02-16 09:36



możesz upuścić "test" i backticks. Jest to analogiczne do "if (test == true)" vs "if (test)" - guns
@guns: nie, nie możesz. - kmkaplan
Masz rację; Przypuszczam, że tak myślałem find zwracany niezerowy, gdy nie znaleziono pasujących elementów. - guns
Możesz rzucić backticks i zrobić, jeśli test $ (znajdź text.txt -mmin +120) - tommy.carstensen
@BroSlow wygląda lepiej: jest Nie "więcej niż jeden" możliwe. Oczywiście, text.txt nie jest katalogiem. - kmkaplan


Zawsze lubiłem używać date -r /the/file +%s aby znaleźć swój wiek.

Możesz także zrobić touch --date '2015-10-10 9:55' /tmp/file aby uzyskać niezwykle dokładny czas w dowolnym momencie / czasie.


33
2018-03-08 00:46



Szukałem dzisiaj tego samego. Najlepiej! - Neutralizer
Dzięki. Wylądowałem na tym pytaniu SO, ponieważ szukałem w Google "jak drukować wiek pliku bash". Więc tego właśnie szukałem! - Noah Sussman
Dzięki! z jedynym zastrzeżeniem, że powyższy jest znacznikiem czasu (nie wiekiem), ale może być użyty do obliczenia wieku tak jak to let AGE=$(($(date +%s)-$(date -r /path/to/file +%s)))  [przy założeniu, że stworzone i nigdy nie zmodyfikowane, lub "wiek względem mod"] - nhed
function file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; } - turiyag


Czas tworzenia nie jest przechowywany.

Przechowywane są trzy znaczniki czasu (zazwyczaj można je wyłączyć w niektórych systemach plików lub w określonych opcjach systemu plików):

  • Ostatni czas dostępu
  • Czas ostatniej modyfikacji
  • Ostatnia zmiana czasu

"Zmiana" pliku jest liczona jako zmiana uprawnień, zmiana nazwy itp. Modyfikacja dotyczy tylko zawartości.


16
2018-02-16 09:33





Używając stat ustalić datę ostatniej modyfikacji pliku, date aby sprawdzić aktualny czas i swobodne użycie bashisms, można zrobić test, który chcesz na podstawie czasu ostatniej modyfikacji pliku1.

if [ "$(( $(date +"%s") - $(stat -c "%Y" $somefile) ))" -gt "7200" ]; then
   echo "$somefile is older then 2 hours"
fi

Chociaż kod jest nieco mniej czytelny, to find podejście, myślę, że jest to lepsze podejście niż działanie find aby spojrzeć na plik "już znaleziony". Również manipulowanie datami jest fajne ;-)


  1. Jak słusznie zauważył Phil, czas utworzenia nie jest rejestrowany, ale należy go użyć %Z zamiast %Y poniżej, aby uzyskać "czas zmiany", który może być tym, co chcesz.

[Aktualizacja]

Dla użytkowników mac, użyj stat -f "%m" $somefile zamiast powyższej składni specyficznej dla Linuksa


12
2017-09-09 19:18



Do której powłoki jest wbudowana data i stat? Mój bash (GNU, 3.2.48) ich nie ma. - Ian Clelland
UPS przepraszam. stat nie jest wbudowany - bardzo źle, naprawię. - Guss
@ Tommy.carstensen - Nie mam dostępnego mac. Czy możesz opisać, co nie działa? Czy używasz bash? Wiem, że wielu Macistów woli Zsh. - Guss
@ErikJohansson Wolę nie wymagać instalacji dodatkowego oprogramowania, gdy korzystanie z istniejącego działa dobrze - to nie jest Windows, wiesz ;-) - Guss
Dla osób, które chcą tego użyć, ale go zmodyfikować, dobrze byłoby wiedzieć dokładnie, co robi: $ (($ (data + "% s") - sekundy od 1970-01-01 00:00:00 UTC (Epoch) $ (stat -c "% Y" $ somefile))) - Czas ostatniej modyfikacji jako sekundy od Epocha -gt "7200" - sprawdza, czy różnica jest większa niż x liczba sekund. - devo


Chociaż ctime nie jest technicznie czas stworzenia, dość często.

Ponieważ ctime nie podlega zmianom zawartości pliku, zwykle jest aktualizowany tylko wtedy, gdy plik zostanie utworzony. I tak - słyszę, jak wszyscy krzycząście - jest również aktualizowany, jeśli zmienisz uprawnienia dostępu lub prawo własności ... ale generalnie jest to coś, co zostało zrobione raz, zwykle w tym samym czasie, gdy umieścisz tam plik.

Osobiście zawsze używam mtime na wszystko i wyobrażam sobie, że tego właśnie chcesz. Ale w każdym razie ... tutaj jest remake "nieatrakcyjnego" basha Gussa w łatwej w użyciu funkcji.

#! / bin / bash
function age () {
   nazwa pliku lokalnego = 1 $
   local changed = `stat -c% Y" $ filename "`
   local teraz = `date +% s`
   upłynął czas lokalny

   let elapsed = now-changed
   echo $ minęło
}

file = "/"
echo Wiek pliku $ to $ (wiek "plik $") sekund.

11
2018-03-25 10:15



Było to użyteczne, ale nie działało od razu dla OSX, ponieważ statystyki są zaimplementowane w inny sposób. Jedynym sposobem, jaki znalazłem w kompatybilności z systemami, był perl. Skrypt powinien działać na komputerach Mac, jeśli zastąpisz odpowiednią linię: local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime")  superuser.com/questions/427551/... - Bijou Trouvaille
"Czas tworzenia" jest pojęciem trudnym do uchwycenia. Co to oznacza dla skopiowanego pliku? Co dla przeniesionego pliku? Co się stanie, jeśli zostanie przeniesiony na granicę urządzenia (tak, że w pewnym sensie został stworzony na nowo)? Co to oznacza dla spakowanego i później rozpakowanego pliku? Możliwe są tutaj liczne odpowiedzi i nie ma konsensusu. Wspominanie o cime jest jednak przyjemne, ale nie nazwałbym tego semantycznie blisko niejasnego pojęcia "czasu stworzenia". Zwłaszcza, że ​​jest prosty chmod, zastosowane w pliku, unieważni ten pomysł. Ale mogę z tym żyć ty robiąc to ;-) - Alfe
@Alfe: Tęsknisz za +%s od drugiej połowy - Grizly
Ten wiek może być znacznie krótszy: age() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); }  (Podziękowania dla @Grizly za poprawkę!) - Alfe
Właściwie lepiej jest użyć czasu dostępu, który jest czasem tworzenia wszystkich podłączonych systemów plików noatime opcja (która jest dobra dla wydajności, więc powinieneś jej użyć). Więc po prostu użyj %X zamiast %Y. - Nux


Odnalezienie jest dobre, ale myślę, że możesz użyć innego, szczególnie jeśli potrzebujesz teraz ile sekund pliku jest stary

date -d "now - $( stat -c "%Y" $filename ) seconds" +%s

używając daty GNU


5
2018-05-06 13:06



Nie działa na komputerze Mac. - tommy.carstensen
użyj gstat, "brew install coreutils" - Erik Johansson
@ erik-johansson Nie mam uprawnień administratora. - tommy.carstensen


Rozważ wynik narzędzia "stat":

  File: `infolog.txt'
  Size: 694         Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 11635578    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     fdr)   Gid: ( 1000/     fdr)
Access: 2009-01-01 22:04:15.000000000 -0800
Modify: 2009-01-01 22:05:05.000000000 -0800
Change: 2009-01-01 22:05:05.000000000 -0800

Tutaj można zobaczyć trzy daty dostępu / modyfikacji / zmiany. Nie ma stworz Date. Możesz być naprawdę pewny, kiedy zawartość pliku była zmodyfikowano (pole "modyfikacja") lub zmieniono jego i-węzeł ("zmiana" pole).

Przykłady, kiedy oba pola są aktualizowane:

"Modyfikuj" zostanie zaktualizowane, jeśli ktoś połączy dodatkowe informacje koniec pliku.

"Zmień" zostanie zaktualizowane, jeśli ktoś zmieni uprawnienia za pomocą polecenia chmod.


3
2018-02-16 09:33



przyznane, stat może podać odpowiednie informacje. Ale będzie to dość nudne, aby parsować, aby uzyskać to, czego chcemy. - PypeBros