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
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
Odpowiedzi:
Tylko na czas modyfikacji
if test `find "text.txt" -mmin +120`
then
echo old enough
fi
Możesz użyć -cmin
do zmiany lub -amin
czasu dostępu. Jak wskazywali inni, nie sądzę, aby można było śledzić czas tworzenia.
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.
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 .
if [ "$(( $(date +"%s") - $(stat -c "%Y" $somefile) ))" -gt "7200" ]; then
echo "$somefile is older then 2 hours"
fi
Chociaż kod jest nieco mniej czytelny niż find
podejście, myślę, że jest to lepsze podejście niż bieganie w find
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
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.
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.
#! / bin / bash function age () { lokalna nazwa pliku = $ 1 lokalna zmiana = `stat -c% Y" $ filename "` ` local now = `date +% s` lokalny upłynął let elapsed = teraz-zmienione echo $ minęło } plik = „/” echo Wiek pliku $ file wynosi $ (wiek "$ file") sekund.
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łowy
age() { 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
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
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.