Jak sprawdzić wszystkie znaczniki czasu pliku?

52

Czy w systemie Linux jest polecenie sprawdzające wszystkie znaczniki czasu pliku?

Próbuję zobaczyć ostatnio zmodyfikowane, utworzone i dotknięte daty w pliku.

Mechaflash
źródło
4
Dla przypomnienia, pliki Linuksa nie mają dat urodzenia. Dlatego nie można ustalić daty utworzenia pliku.
FatalError
zauważyłem, że = (. Dzięki za wskazanie mi tego.
Mechaflash,
4
@ FatalError: Różne systemy plików obsługują już znaczniki czasu narodzin / tworzenia; prawdziwym problemem jest dostęp do takich dodatkowych informacji. (Nie można po prostu przedłużyć struct statbez zepsucia, niestety ...) Możesz wypróbować debugfs -R "stat <1234>" /dev/sdXYext4, zastępując 1234ino.
grawitacja
@grawity: Neat! Zawsze zastanawiałem się, dlaczego żaden fs go nie miał ... ale chyba tak, ale tak jak powiedziałeś, nie można po prostu złamać ABI dla istniejących plików binarnych. Dzięki za wskazówkę :).
FatalError
1
@ FatalError, Czas urodzenia można wyświetlić za pomocą statpolecenia Linux , patrz Jak znaleźć datę utworzenia pliku? i Jakie systemy plików w systemie Linux przechowują czas utworzenia? .
Franklin Piat

Odpowiedzi:

73

Komenda nazywa się stat.

$ stat test
234881026 41570368 -rw-r--r-- 1 werner staff 0 0 "Feb  7 16:03:06 2012" "Feb  7 16:03:06 2012" "Feb  7 16:03:06 2012" "Feb  7 16:03:06 2012" 4096 0 0 test

Jeśli chcesz dostosować format, zapoznaj się ze stronami podręcznika, ponieważ dane wyjściowe są specyficzne dla systemu operacyjnego i różnią się w zależności od systemu Linux / Unix.

Zasadniczo można również uzyskać czas poprzez normalną listę katalogów:

  • ls -l wyświetla wynik ostatniej modyfikacji zawartości pliku, mtime
  • ls -lcwypisuje ostatni raz modyfikację statusu pliku, ctime( jaka jest różnica? )
  • ls -lugeneruje czas ostatniego dostępu, atime(chociaż przydatność tej koncepcji jest przedmiotem dyskusji )

I oczywiście ctimenie nagrywa, kiedy plik został „utworzony”. Specyfikacja POSIX definiuje tylko trzy znaczniki czasu, ale niektóre systemy plików Linux przechowują Czas narodzin / Czas utworzenia. Jak znaleźć datę utworzenia pliku? W takiej obsługiwanej konfiguracji można użyć

stat --printf '%n\nmtime: %y\nctime: %z\natime: %x\ncrtime:%w\n'
slhck
źródło
statjest naprawdę szczegółowy. Ale lspotrzebuje tylko jednej linii. Byłoby dobrze, gdyby mógł wyświetlać sekundy. Jednak podczas tworzenia list plików ten pierwszy jest doskonale odpowiedni.
neverMind9,
ls -l było dla mnie szybkim rozwiązaniem
Andrew
Zauważyłem, że wynik ls -lmoże pokazywać inny format daty, gdy BusyBox jest zainstalowany (na Androidzie). Myślę, że bez niego jest jak „2019-07-26 14:41”, a wraz z nim jest jak „6 maja 21:27”. Dlaczego brakuje roku? Czy istnieje sposób, aby wymusić użycie formatu bez niego?
programista Androida
@androiddeveloper Jak powiedziałem, odpowiedź zależy od systemu operacyjnego. Myślę, że powinieneś otworzyć nowe pytanie. Jeśli mówisz konkretnie o Androidzie, być może bardziej pasuje stos Overflow lub entuzjaści Androida .
slhck
@slhck Cóż, to ten sam system operacyjny, tylko z zainstalowanym BusyBox. Zapytałem, czy jest to możliwe (co oznacza: czy istnieje polecenie do użycia), aby uzyskać format, który zostanie wyświetlony.
programista Androida
21

Dla każdego pliku przechowywane są tylko TRZY różne czasy razy, zgodnie z definicją standardu POSIX : http://pubs.opengroup.org/onlinepubs/9699919799/ (patrz sekcja Definicje podstawowe -> 4. Ogólne pojęcia -> plik 4.8 Times Update)

Każdy plik ma trzy różne powiązane znaczniki czasu: czas ostatniego dostępu do danych , czas ostatniej modyfikacji danych oraz czas ostatniej zmiany stanu pliku . Wartości te są zwracane w strukturze struktur pliku charakterystyk pliku stat stat, jak opisano w <sys / stat.h> .

I z <sys / stat.h> :

atime is for Last data access timestamp.
mtime is for Last data modification timestamp.
ctime is for Last file status change timestamp.

Poniższe przykłady pokazują różnicę między atime , mtime i ctime , te przykłady są w GNU / Linux BASH. Możesz używać stat -xw Mac OS X lub innym BSD Dist. aby zobaczyć podobny format wyjściowy.

$ stat --version
stat (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Michael Meskes.
$
$ touch test
$ stat test
  File: `test'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:58:28.609223953 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 10:58:28.609223953 +0800

Po utworzeniu pliku trzy znaczniki czasu są takie same.


1. atime

Najpierw uzyskajmy dostęp do danych pliku przez odczytanie go ( lesslub vim), wydrukowanie go ( cat) lub skopiowanie go do innego pliku ( cp).

$ cat test #Nothing will be printed out, since the file is empty
$ stat test
  File: `test'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800  <-- atime Changed!
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 10:58:28.609223953 +0800

2. ctime

Teraz zmienić status pliku, poprzez zmianę zezwolenia ( chmod) lub zmianę jego nazwy ( mv)

$ chmod u+x test
$ stat stet
  File: `test'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0764/-rwxrw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 11:04:10.178285430 +0800  <-- ctime Changed!
$    
$ mv test testing
$ stat testing
  File: `testing'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0764/-rwxrw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 11:06:33.342207679 +0800  <-- ctime Changed again!

Zauważ, że do tej pory zawartość ( dane ) pliku była taka sama jak w momencie jego utworzenia.


3. mtime

Na koniec zmodyfikujmy zawartość pliku poprzez edycję pliku.

$ echo 'Modify the DATA of the file' > testing
$ echo 'Modify the DATA of the file also change the file status' > testing
$ stat testing
  File: `testing'
  Size: 56          Blocks: 8          IO Block: 4096   regular file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0764/-rwxrw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 11:09:48.247345148 +0800  <-- mtime Changed!
Change: 2014-03-16 11:09:48.247345148 +0800  <-- ctime also Changed!

4. czas urodzenia

Zauważ również, że nowsza wersja stat(np. stat --version 8.13W Ubuntu 12.04) ma czwartą informację o znaczniku czasu - czas urodzenia (czas utworzenia pliku). Chociaż na razie może nie wyświetlać właściwego czasu:

$ stat --version
stat (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Michael Meskes.
$
$ stat birth_time
  File: `birth_time'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 4073946     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/ bingyao)   Gid: ( 1000/ bingyao)
Access: 2014-03-16 10:46:48.838718970 +0800
Modify: 2014-03-16 10:46:48.838718970 +0800
Change: 2014-03-16 10:46:48.838718970 +0800
 Birth: -
YaOzI
źródło
Jakie jest znaczenie 10: 46: 48.838718970? GG: MM: SS. nanosekundy?
Dzung Nguyen,
2
Tak . „Od jądra 2.5.48 struktura statystyk obsługuje rozdzielczość nanosekundową dla trzech pól znaczników czasu pliku ...”
Tom Lord,
W razie potrzeby można ustalić czas tworzenia z dostępem do katalogu głównego i debugowaniem
Mikko Rantalainen
2
Czas urodzenia… chętnie. Ponieważ ostatnia modyfikacja i ostatnia zmiana są prawie w tym samym celu, ale wciąż odrębne. Dobrze, jeśli wszystkie cztery istnieją.
neverMind9,