uzyskaj wiek danego pliku

12

Jak mogę uzyskać wiek danego pliku co najmniej za kilka dni?

Jestem świadomy ls -lhi podobnych poleceń. Chcę coś, co będzie działać w ten sposób:

getfage <FILE> # prints out '12d' (12 days)

Ponadto musi to być nieco wieloplatformowe, ponieważ chciałbym również używać tego w systemie Mac OS X, ale główny przypadek użycia znajduje się na moim Linux-boxie.

UWAGA

Ponieważ Linux nie śledzi czasu tworzenia, szukam podwójnego rozwiązania: jednego dla mtime (linux) - to jest ostatni raz, gdy wspomniany plik został zmodyfikowany - i jednego dla Mac OS X, z którym można sobie poradzić mtime lub czas utworzenia.

Alexej Magura
źródło
@slm Dotyczy to w szczególności czasu tworzenia, nie zajmuje się obliczaniem wieku w wierszu poleceń.
Gilles 'SO - przestań być zły'
@terdon, niezupełnie. Zobacz moją UWAGA powyżej.
Alexej Magura
@AlexejMagura i jak dla ciebie nie odpowiadają odpowiedzi w dupe? statdaje ci wszystko, czego potrzebujesz, prawda?
terdon

Odpowiedzi:

17

Unix nie śledzi daty utworzenia. Jedyne dostępne informacje to zazwyczaj ostatnie pliki:

  1. Dostęp
  2. Zmodyfikowano
  3. Zmieniono
  • Dostęp - ostatni odczyt pliku
  • Modyfikuj - ostatnia modyfikacja pliku (treść została zmodyfikowana)
  • Zmień - ostatnia zmiana metadanych pliku (np. Uprawnienia)

( Z tej odpowiedzi )

Za pomocą statpolecenia można uzyskać daty związane z określonym plikiem .

Przykład

$ stat ffmpeg 
  File: `ffmpeg'
  Size: 19579304    Blocks: 38248      IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 10356770    Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (  500/    saml)   Gid: (  501/    saml)
Access: 2013-11-26 10:49:09.908261694 -0500
Modify: 2013-11-02 17:05:13.357573854 -0400
Change: 2013-11-02 17:05:13.357573854 -0400

OSX i HFS

Jeśli używasz OSX, systemem plików używanym w tym Uniksie jest HFS . Jest to jeden z niewielu (o których wiem), który utrzymuje datę utworzenia w systemie plików, wraz z czasem modyfikacji itp. Podobnym do innych Uniksów.

fragment

Rekord pliku przechowuje różnorodne metadane dotyczące pliku, w tym jego identyfikator CNID, rozmiar pliku, trzy znaczniki czasu (kiedy plik został utworzony, ostatnia modyfikacja, ostatnia kopia zapasowa), pierwszy zakres danych widelców i wskaźników oraz wskaźników do pierwszych rekordów danych i zakresu zasobów w pliku Extent Overflow. Rekord pliku przechowuje również dwa 16-bajtowe pola, które są używane przez Finder do przechowywania atrybutów dotyczących pliku, w tym takich jak jego kod twórcy, kod typu, okno, w którym plik powinien się pojawić oraz jego lokalizacja w oknie.

Znaczniki czasu

Znaczniki czasu są zawsze zachowywane w systemie plików, więc jesteś ograniczony przez to, jakie śledzenie czasu jest przez nie oferowane (EXT3, EXT4, XFS itp.).

Systemy plików

Jeśli kiedykolwiek będziesz ciekawy, spójrz na ten temat w Wikipedii: Porównanie systemów plików . Ma najobszerniejszą listę tematów plików, o których wiem, wraz z ładną tabelą różnych funkcji i statusu, czy jest obsługiwany czy nie w danym systemie plików.

Bibliografia

slm
źródło
Dzięki za aktualizację, która pomaga. W rzeczywistości przeczytałem tutaj, że ext4 może przechowywać daty utworzenia, ale nie zostało to jeszcze zaimplementowane w jądrze.
terdon
@terdon - tak, ma sens, że niektóre systemy plików by to wspierały. Wydaje mi się, że jest to od dawna spóźnione, rozumiem w przeszłości, dlaczego zostało to pominięte, ale wszystko posunęło się tak bardzo od początku, że nie ma sensu jawnie tego nie mieć. Możesz także wyłączyć obsługę czasu dostępu, aby można ją było zaimplementować podobnie, a następnie wyłączyć, jeśli naprawdę tego nie chcesz.
slm
18

OSX śledzi tworzenie plików, ale większość innych jednorożców tego nie robi, więc nie ma sposobu, aby poznać upływ czasu od utworzenia pliku. Czas, który upłynął od ostatniej modyfikacji, można uzyskać w dowolnym systemie operacyjnym.

Nie ma przenośnego narzędzia powłoki do pobierania czasu modyfikacji pliku, z wyjątkiem tego, że lsma wyjście, które jest prawie niemożliwe do przeanalizowania. W systemie Linux następujące polecenie wypisuje wiek pliku:

echo $(($(date +%s) - $(date +%s -r "$filename"))) seconds
echo $((($(date +%s) - $(date +%s -r "$filename")) / 86400)) days

W systemie Linux możesz używać go stat -c %Y -- "$filename"jako synonimu date +%s -r "$filename".

OSX datei statpolecenia są różne. Możesz użyć następującego polecenia:

echo $(($(date +%s) - $(stat -t %s -f %m -- "$filename"))) seconds

Wbudowane systemy Linux i OSX mają domyślnie zainstalowany Perl.

perl -l -e 'print -M $ARGV[0], " days"' "$filename"
Gilles „SO- przestań być zły”
źródło
Czy to zależy od systemu operacyjnego lub systemu plików? Te pytania i odpowiedzi wydają się sugerować, że system plików je utrzymuje, ale jądro musi zapewnić metodę dostępu do nich.
terdon
@terdon - zobacz moje aktualizacje.
slm
@terdon Both. Ponieważ pytania i odpowiedzi, które łączysz, są prawidłowe, obecne systemy plików już od jakiegoś czasu śledzą czas tworzenia. W FreeBSD możesz to uzyskać stat, w Linuksie syscall nie został przerobiony, więc musisz uciekać się do hakowania debugfs.
wingedsubmariner
1
@wingedsubmariner Z zastrzeżeniem, że czas utworzenia w systemie plików często nie jest datą utworzenia w aplikacji, ponieważ wiele aplikacji używa metody create-new-then-move jako metody zapisywania nowej wersji, a nie zastępowania na miejscu.
Gilles „SO- przestań być zły”
4

Na podstawie odpowiedzi Gillesa, oto funkcja bash, która zwraca wiek pliku w sekundach lub błąd.

function fileAge
{
    local fileMod
    if fileMod=$(stat -c %Y -- "$1")
    then
        echo $(( $(date +%s) - $fileMod ))
    else
        return $?
    fi
}
Nicholas Sushkin
źródło
1
Zgrabna funkcja, łatwa do dostosowania przez dodanie prostego podziału, aby zobaczyć wiek w godzinach, dniach, tygodniach ...
Emmanuel Devaux
0

Można użyć stat -f%B, ls -lUlub mdls -n kMDItemFSCreationDateaby zobaczyć czas tworzenia (narodziny) w OS X:

$ stat -f%B file
1402340803
$ ls -lU file
-rw-r--r--  1 admin  staff  108514 Jun  9 22:06 file
$ mdls -n kMDItemFSCreationDate file
kMDItemFSCreationDate = 2014-06-09 19:06:43 +0000
$ echo $((($(date +%s)-$(stat -f%B file))/86400))
10
Lri
źródło
0
stat -c %Y <filename>

spojrzeć man statna -copcje (Format)

Guido Rizzi
źródło