Muszę znaleźć czas utworzenia pliku, kiedy czytam kilka artykułów na ten temat, wszystkie wspominają, że nie ma rozwiązania (jak Site1 , Site2 ).
Kiedy próbowałem stat
polecenia, stwierdza Birth: -
.
Jak mogę znaleźć czas utworzenia pliku?
filesystem
metadata
stat
nux
źródło
źródło
Odpowiedzi:
Istnieje sposób, aby poznać datę utworzenia katalogu, wykonaj następujące kroki:
Poznaj i- węzeł katalogu za pomocą
ls -i
polecenia (powiedzmy na przykład, że jego X )Dowiedz się, na której partycji Twój katalog jest zapisany za pomocą
df -T /path
polecenia (powiedzmy, że jest włączony/dev/sda1
)Teraz użyj tego polecenia:
sudo debugfs -R 'stat <X>' /dev/sda1
W wyniku zobaczysz:
crtime to data utworzenia pliku.
Co testowałem :
Zmodyfikowano go, tworząc plik.
Wypróbowałem polecenie i podało dokładny czas.
źródło
debugfs
wyodrębnia go bezpośrednio z systemu plików, więc nie musi używać interfejsu API jądra. Zobacz tutaj .statx()
od marca 2019 r.@Nux znalazł świetne rozwiązanie tego problemu, o którym wszyscy powinniście głosować. Postanowiłem napisać małą funkcję, której można użyć do bezpośredniego uruchamiania wszystkiego. Po prostu dodaj to do swojego
~/.bashrc
.Teraz możesz uruchomić,
get_crtime
aby wydrukować daty utworzenia tylu plików lub katalogów, ile chcesz:źródło
cp -p
lub podobnie.df
nie obsługuje tej--output
opcji. W takim przypadku możesz zastąpić tę linięfs=$(df foo | awk '{a=$1}END{print a}'
i funkcja również będzie działać. W tej odpowiedzi pokazuję tylko sposób na zawinięcie polecenia z zaakceptowanej odpowiedzi w sposób, który można uruchomić bezpośrednio dla obiektów docelowych plików / katalogów.Niemożność
stat
pokazania czasu utworzenia wynika z ograniczeniastat(2)
wywołania systemowego , którego struktura powrotu nie zawierała pola dla czasu utworzenia. Począwszy od Linuksa 4.11 (tj. 17.10 i nowszych *) dostępne jest jednak nowestatx(2)
wywołanie systemowe , które zawiera czas utworzenia w strukturze zwracanej.* I prawdopodobnie w starszych wersjach LTS przy użyciu jądra stosu włączania sprzętu (HWE). Sprawdź,
uname -r
czy używasz jądra przynajmniej w wersji 4.11 w celu potwierdzenia.Niestety wywołanie systemowe nie jest łatwe bezpośrednio w programie C. Zazwyczaj glibc zapewnia opakowanie, które ułatwia zadanie, ale glibc dodał tylko opakowanie
statx(2)
w sierpniu 2018 r. (Wersja 2.28 , dostępna w 18.10). Na szczęście @whotwagner napisał przykładowy program C, który pokazuje, jak używaćstatx(2)
wywołania systemowego w systemach x86 i x86-64. Jego format wyjściowy jest taki sam, jakstat
domyślny, bez żadnych opcji formatowania, ale łatwo go zmodyfikować, aby wydrukować tylko datę urodzenia.Najpierw sklonuj:
Możesz skompilować
statx.c
kod lub, jeśli chcesz tylko czas urodzenia, utworzyćbirth.c
w sklonowanym katalogu następujący kod (który jest minimalną wersjąstatx.c
drukowania tylko znacznika czasu utworzenia, w tym precyzji nanosekundowej):Następnie:
Teoretycznie powinno to uczynić czas tworzenia bardziej dostępnym:
debugfs
jest to narzędzie do systemów plików ext2 / 3/4 i nie nadaje się do użytku na innych)make
ilinux-libc-dev
).Testowanie systemu XFS, na przykład:
Nie działało to jednak w przypadku systemu plików NTFS i exfat. Wydaje mi się, że systemy plików FUSE dla tych nie zawierały czasu utworzenia.
Jeśli, a raczej kiedy glibc doda obsługę
statx(2)
wywołania systemowego,stat
nastąpi wkrótce i będziemy mogli użyć do tego zwykłego staregostat
polecenia. Ale nie sądzę, że zostanie to przeniesione do wersji LTS, nawet jeśli otrzymają nowsze jądra. Nie spodziewamstat
się więc, że w żadnej bieżącej wersji LTS (14.04, 16.04 lub 18.04) kiedykolwiek wydrukuję czas tworzenia bez ręcznej interwencji.Jednak w dniu 18.10 można bezpośrednio użyć
statx
funkcji opisanej wman 2 statx
(zauważ, że strona podręcznika 18.10 nie zgadza się z twierdzeniem, że glibc nie dodał jeszcze opakowania).źródło
1
?TL; DR: Po prostu uruchom:
sudo debugfs -R 'stat /path/to/your/file' /dev/<your fs>
(Aby dowiedzieć się, jaki jest twój fs, uruchom
df -T /path/to/your/file
, najprawdopodobniej tak będzie/dev/sda1
).Długa wersja:
Uruchomimy dwa polecenia:
Znajdź nazwę partycji dla swojego pliku.
Dane wyjściowe będą wyglądać następująco (nazwa partycji jest pierwsza):
Dowiedz się czas utworzenia tego pliku.
W wyniku wyszukaj
ctime
.źródło