Chcę sprawdzić w linux bash, czy plik został utworzony więcej niż x razy temu.
powiedzmy, że plik nazywa się text.txt, a czas to 2 godziny.
if [ what? ]
then
echo "old enough"
fi
linux
bash
command-line
Lecieć jak po sznurku
źródło
źródło
find
zwraca wartość niezerową, gdy nie znaleziono żadnych dopasowań.text.txt
zakłada się , że nie jest to katalog.[ "$(find path/to/file -mmin +120)" ] && echo "it is old"
Zawsze lubiłem używać,
date -r /the/file +%s
aby znaleźć swój wiek.Możesz również zrobić
touch --date '2015-10-10 9:55' /tmp/file
bardzo drobnoziarnisty czas w dowolnej dacie / godzinie.źródło
let AGE=$(($(date +%s)-$(date -r /path/to/file +%s)))
[przy założeniu, że tworzone i nie modyfikowane lub „wiek względnej mod”]function file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; }
$[ ]
, jeśli nie jest przestarzała , to przynajmniej stara i mniej przenośna , a$(( ))
zamiast tego należy użyć ; a cytaty wsteczne są bardziej kruche niż$( )
; a także łączniki w nazwach funkcji mogą nie być w pełni przenośne. Jednak istota tego jest dobra!Korzystając z,
stat
aby ustalić datę ostatniej modyfikacji pliku,date
określić aktualny czas i liberalne użycie bashizmów, można przeprowadzić test, który chcesz, na podstawie czasu ostatniej modyfikacji pliku 1 .Chociaż kod jest nieco mniej czytelny niż
find
podejście, myślę, że jest to lepsze podejście niż bieganie wfind
celu przejrzenia pliku, który już „znalazłeś”. Poza tym manipulowanie datami jest fajne ;-)%Z
zamiast%Y
poniżej, aby uzyskać „czas zmiany”, który może być tym, czego chcesz.[Aktualizacja]
W przypadku użytkowników komputerów Mac użyj
stat -f "%m" $somefile
zamiast powyższej składni specyficznej dla systemu Linuxźródło
stat
nie jest wbudowany - bardzo źle ze mnie, naprawię.Czas utworzenia nie jest przechowywany.
Przechowywane są trzy znaczniki czasu (generalnie można je wyłączyć na niektórych systemach plików lub za pomocą pewnych opcji systemu plików):
„Zmiana” w pliku jest liczona jako zmiana uprawnień, zmiana nazwy itp. Podczas gdy modyfikacja dotyczy tylko zawartości.
źródło
Chociaż ctime nie jest technicznie czasem tworzenia, dość często nim jest.
Ponieważ ctime nie mają na niego wpływu zmiany zawartości pliku, zwykle jest on aktualizowany tylko podczas tworzenia pliku. I tak - słyszę, jak wszyscy krzyczysz - jest również aktualizowany, jeśli zmienisz uprawnienia dostępu lub własność ... ale ogólnie jest to coś, co robi się raz, zwykle w tym samym czasie, gdy umieszczasz tam plik.
Osobiście zawsze używam mtime do wszystkiego i wyobrażam sobie, że tego właśnie chcesz. Ale w każdym razie ... oto powtórka „nieatrakcyjnego” basha Gussa w łatwej w użyciu funkcji.
źródło
local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime")
chmod
, zastosowany do pliku, unieważni ten pomysł. Ale mogę z tobą żyć ;-)+%s
drugiej połowyage() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); }
(Dzięki @Grizly za korektę!)noatime
opcją (co jest dobre dla wydajności, więc powinieneś go używać). Więc po prostu użyj%X
zamiast%Y
.Znajdowanie jest dobre, ale myślę, że możesz użyć innego sposobu, zwłaszcza jeśli potrzebujesz teraz, ile sekund jest stary plik
date -d "now - $( stat -c "%Y" $filename ) seconds" +%s
używając daty GNU
źródło
Rozważ wynik narzędzia „stat”:
Możesz zobaczyć tutaj trzy daty dostępu / modyfikacji / zmiany. Nie ma daty utworzenia. Możesz być naprawdę pewien tylko, kiedy zawartość pliku została zmodyfikowana (pole „modyfikuj”) lub zmienił się jego i-węzeł (pole „zmiana”).
Przykłady sytuacji, gdy oba pola są aktualizowane:
„Modyfikuj” zostanie zaktualizowane, jeśli ktoś połączy dodatkowe informacje na końcu pliku.
„Zmiana” zostanie zaktualizowana, jeśli ktoś zmieni uprawnienia przez chmod.
źródło
używam
źródło