2009-02-16 13 views

Odpowiedz

95

Tylko czas modyfikacji

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

Albo to samo w jednym wierszu:

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

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

+1

możesz upuścić "test" i backticks. Jest to analogiczne do "if (test == true)" vs "if (test)" – guns

+3

@ guns: no you can not. – kmkaplan

+2

Masz rację; Przypuszczam, że pomyślałem, że 'find' zwróciło się niezerowo, gdy nie znaleziono pasujących elementów. – guns

15

Czas tworzenia nie jest przechowywany.

Jakie są przechowywane są trzy znaczniki czasu (zazwyczaj mogą być wyłączone w niektórych systemach plików lub pewnych opcji systemu plików):

  • czas ostatniego dostępu
  • czas ostatniej modyfikacji
  • czas Ostatnia zmiana

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

3

Rozważmy 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żna zobaczyć tu trzy daty dla programu Access/modyfikacji/zmian. Nie ma utworzonej daty. Możesz tylko upewnić się, że zawartość pliku została zmodyfikowana (zmieniono "pole") lub jego i-węzeł zmieniony (pole "zmień" ).

Przykłady gdy oba pola aktualizowane:

„Modyfikuj” zostanie zaktualizowany, jeśli ktoś łączone dodatkowe informacje koniec pliku.

"Zmiana" zostanie zaktualizowana, jeśli ktoś zmienił uprawnienia za pomocą polecenia chmod.

+0

przyznane, stat można powiedzieć odpowiednie informacje. Ale będzie to dość nudne, aby parsować, aby uzyskać to, czego chcemy. – PypeBros

10

Używanie stat dowiedzieć się datę ostatniej modyfikacji pliku, date aby dowiedzieć się aktualny czas i liberalne stosowanie bashisms, można zrobić test, który chcesz w oparciu o czas ostatniej modyfikacji pliku, .

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

Podczas gdy kod jest nieco mniej czytelny następnie podejście find, myślę, że jest to lepsze podejście następnie uruchomiony find patrzeć na pliku, który już „znalezionego”.Również data manipulacja jest zabawa ;-)


  1. Jak słusznie zauważył Phil czas stworzenie nie jest rejestrowane, ale zamiast używać %Z%Y poniżej, aby uzyskać „czas zmian”, które mogą być, co chcesz.

[Aktualizacja]

dla użytkowników Mac, użyj stat -f "%m" $somefile zamiast specyficznej składni Linux powyżej

+0

W której powłoce są wbudowane daty i statystyki? Mój bash (GNU, 3.2.48) ich nie ma. –

+0

oops, przepraszam. 'stat' nie jest wbudowany - bardzo źle, naprawię. – Guss

+0

@ 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

11

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

Ponieważ ctime nie podlega zmianom w treści pliku, zwykle jest aktualizowany tylko po utworzeniu pliku. 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() { 
    local filename=$1 
    local changed=`stat -c %Y "$filename"` 
    local now=`date +%s` 
    local elapsed 

    let elapsed=now-changed 
    echo $elapsed 
} 

file="/" 
echo The age of $file is $(age "$file") seconds. 
+0

To było przydatne, ale nie działało od razu dla OSX, ponieważ statystyki są zaimplementowane inaczej. 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ę: Zmienna "local changed = $ (perl -MFile :: stat -e" print (\ "$ {nazwa pliku} \") -> mtime ")' http://superuser.com/questions/427551/is-there-a-cross-nix-compatible-way-to-get-file-modified-timestamp –

+1

"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 ​​prosty "chmod", zastosowany w pliku, unieważni ten pomysł. Ale mogę mieszkać z * ty * robiąc to ;-) – Alfe

+0

@Alfe: Tęsknisz za '+% s' z drugiej połowy – Grizly

30

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

Można również wykonać touch --date '2015-10-10 9:55' /tmp/file, aby uzyskać wyjątkowo dokładny czas w dowolnym dniu/czasie.

+0

Szukałem dzisiaj tego samego. Najlepiej! – Neutralizer

+0

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! –

+1

Dzięki! z jedynym zastrzeżeniem, że powyższy jest znacznikiem czasu (nie wiekiem), ale może być użyty do obliczenia wieku w taki sposób, jak: "let AGE = $ (($ (data +% s) - $ (data -r/ścieżka/do pliku +% s))) '[z założeniem, które zostało stworzone i nigdy nie zostało zmodyfikowane, lub" wiek względem mod "] – nhed

5

znaleźć jeden jest dobry, ale myślę, że można użyć anotherway, szczególnie jeśli trzeba teraz ile sekund jest stary plik

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

używając terminu GNU

+0

Nie działa na komputerze Mac. –

+0

użyj gstat, "brew install coreutils" –

+0

@ erik-johansson Nie mam uprawnień administratora. –

Powiązane problemy