Chcę znaleźć datę utworzenia określonego pliku, a nie datę modyfikacji lub datę dostępu.
Próbowałem z ls -ltrh
i stat filename
.
linux
files
timestamps
stat
Özzesh
źródło
źródło
stat(1)
.stap
do pobierania czasów tworzenia.Odpowiedzi:
Standard POSIX definiuje tylko trzy różne znaczniki czasu, które mają być przechowywane dla każdego pliku: czas ostatniego dostępu do danych, czas ostatniej modyfikacji danych oraz czas ostatniej zmiany statusu pliku.
To powiedziawszy, nowoczesne systemy plików Linux, takie jak ext4, Btrfs i JFS, przechowują czas tworzenia pliku (inaczej czas narodzin), ale używają różnych nazw dla danego pola (
crtime
w ext4,otime
w Btrfs i JFS). Jednak obecnie Linux nie zapewnia interfejsu API jądra umożliwiającego dostęp do czasów tworzenia plików , nawet w systemach plików, które je obsługują.Jak zauważyli Craig Sanders i Mohsen Pahlevanzadeh ,
stat
obsługuje specyfikatory%w
i%W
format wyświetlania czasu narodzin pliku (odpowiednio w formacie czytelnym dla człowieka i w sekundach od Epoki). Jednakstat
sam uzyskuje dostęp do czasu narodzin za pośrednictwemget_stat_birthtime()
dostarczonego przez gnulib (inlib/stat-time.h
), który pobiera czas narodzin z pólst_birthtime
i struktury zwróconych przez wywołanie systemowe. Chociaż na przykład systemy BSD (i w rozszerzeniu OS X) zapewniają za pośrednictwem , Linux nie. Dlatego dane wyjściowe (wskazujące nieznany czas utworzenia) w systemie Linux nawet dla systemów plików, które przechowują czas tworzenia wewnętrznie.st_birthtimensec
stat
stat()
st_birthtime
stat
stat -c '%w' file
-
Jak wskazuje Stephane Chazelas , niektóre systemy plików, takie jak ntfs-3g, ujawniają czasy tworzenia plików poprzez rozszerzone atrybuty plików.
źródło
stap
do stworzenia własnego API jądra. Zobacz przykład w odpowiedzi tutaj.TLDR; Użyj
stap
( „SystemTap” ), aby utworzyć własny interfejs API jądra. Demonstracja ekstrakcji czasu utworzenia ext4 poniżej.Możesz wyodrębnić czasy tworzenia ext4 w systemach Fedora 19. To moje:
Oczywiste jest, że i-węzły na moich partycjach ext4 mają czas utworzenia. Oto skrypt powłoki, który określa i-węzeł powiązany z nazwą pliku, a następnie zwiększa
stat
wynik z czasem utworzenia za pomocąstap
(„systemtap”).Uwaga: To tylko wersja demonstracyjna i bardzo nieefektywna, ponieważ moduł jądra jest tworzony, ładowany i rozładowywany dla każdego wykonania. Jest to prawdopodobnie bardzo delikatne, ponieważ nie jest wykonywane sprawdzanie błędów. Właściwy interfejs API jądra byłby preferowany, ale ten skrypt może być znacznie bardziej wydajny i czytać czasy tworzenia wielu plików / i-węzłów.
[zawartość pliku stap_stat.sh]
Oto demo:
źródło
debugfs + stat
pozwala dostać sięcrtime
bez małpki łatającej jądro.W
ext4
to jest możliwe; ponieważext4
system plików przechowuje czas utworzenia pliku. Ale nadal okaże się, żestat
polecenie nie może wyświetlić daty, ponieważ myślę, że jądro nie ma żadnych interfejsów API do tego.W każdym razie czas narodzin pliku jest przechowywany
ext4
i możesz go znaleźć, chociaż nie metodą bezpośrednią, ale za pomocądebugfs
źródło
xstat filename
/dev/sdxX
jest zamontowany,/some/path
a plik jest/some/path/some/file
, ścieżka, którą należy podać, to tylkosome/file
: jej ścieżka musi być odsyłana nie do katalogu głównego systemu plików, ale do punktu montowania. W przeciwnym razie plik nie zostanie znaleziony.Teoretycznie za pomocą GNU stat można użyć
stat -c '%w'
lub%W
uzyskać datę utworzenia pliku (czyli porę urodzin).W praktyce większość systemów plików nie rejestruje tych informacji, a jądro Linuksa nie zapewnia żadnego dostępu do nich.
Najbliższy możliwy czas to czas pliku, który nie jest czasem utworzenia, jest to czas ostatniej zmiany metadanych pliku.
Linux Weekly News miał kilka ciekawych artykułów kilka lat temu - http://lwn.net/Articles/397442/
źródło
Różnica między
FreeBSD
iGNU\Linux
nastat command
:Jeśli wywołujesz
stat
wGNU\Linux
nim polecenie , wywołuje-x
opcję, ale we FreeBSD powinieneś sam ją wywołać-x
.Zobacz także Jakie systemy plików w systemie Linux przechowują czas utworzenia?
Uwagi:
--printf
jest bardzo przydatny wscripting
...!źródło
W OS X można użyć
ls -lU
,stat -f%B
,GetFileInfo -d
lubmdls -n kMDItemFSCreationDate
:źródło
Spójrz na to:
BTW, działa to tylko na ext4. Nie znalazłem rozwiązania dla BtrFS ... jeszcze;)
źródło