Saya ingin mengetahui tanggal pembuatan file tertentu, bukan tanggal modifikasi atau tanggal akses.
Saya sudah mencoba ls -ltrh
dan stat filename
.
stap
untuk mengambil waktu pembuatan.
Saya ingin mengetahui tanggal pembuatan file tertentu, bukan tanggal modifikasi atau tanggal akses.
Saya sudah mencoba ls -ltrh
dan stat filename
.
stap
untuk mengambil waktu pembuatan.
Jawaban:
Standar POSIX hanya menentukan tiga cap waktu yang berbeda untuk disimpan untuk setiap file: waktu akses data terakhir, waktu modifikasi data terakhir, dan waktu status file terakhir diubah.
Yang mengatakan, sistem file Linux modern, seperti ext4, Btrfs dan JFS, memang menyimpan waktu pembuatan file (alias waktu lahir), tetapi menggunakan nama yang berbeda untuk bidang yang dimaksud ( crtime
dalam ext4, otime
dalam Btrfs dan JFS). Namun, saat ini Linux tidak menyediakan API kernel untuk mengakses waktu pembuatan file , bahkan pada sistem file yang mendukungnya.
Seperti yang ditunjukkan oleh Craig Sanders dan Mohsen Pahlevanzadeh , stat
mendukung %w
dan %W
memformat penspesifikasi untuk menampilkan waktu kelahiran file (dalam format yang dapat dibaca manusia dan dalam hitungan detik sejak masing-masing zaman). Namun, stat
itu sendiri mengakses waktu kelahiran melalui yang get_stat_birthtime()
disediakan oleh gnulib (dalam lib/stat-time.h
), yang mendapat waktu lahir dari st_birthtime
dan st_birthtimensec
bidang stat
struktur dikembalikan oleh stat()
panggilan sistem. Sementara misalnya sistem BSD (dan dalam ekstensi OS X) menyediakan st_birthtime
melalui stat
, Linux tidak. Inilah sebabnya mengapa stat -c '%w' file
output -
(menunjukkan waktu pembuatan yang tidak diketahui) di Linux bahkan untuk sistem file yang menyimpan waktu pembuatan secara internal.
Seperti yang ditunjukkan Stephane Chazelas , beberapa sistem file, seperti ntfs-3g, mengekspos waktu pembuatan file melalui atribut file yang diperluas.
stap
untuk membuat API kernel Anda sendiri. Lihat contoh dalam jawaban di sini.
TLDR; Gunakan stap
( "SystemTap" ) untuk membuat API kernel Anda sendiri. Demo ekstraksi waktu pembuatan ext4 di bawah ini.
Anda dapat mengekstrak waktu pembuatan ext4 pada sistem Fedora 19. Ini milik saya:
$ uname -a
Linux steelers.net 3.11.1-200.fc19.i686.PAE #1 SMP Sat Sep 14 15:20:42 UTC 2013 i686 i686 i386 GNU/Linux
Sudah jelas bahwa inode pada partisi ext4 saya memiliki waktu pembuatan. Berikut ini skrip shell yang menentukan inode yang terkait dengan nama file dan kemudian menambah stat
output dengan waktu pembuatan dengan menggunakan stap
("systemtap").
NB: Ini hanya demo dan sangat tidak efisien karena modul kernel dibuat, dimuat, dan dibongkar untuk setiap eksekusi. Ini juga mungkin sangat rapuh karena tidak ada pengecekan kesalahan yang dilakukan. API kernel yang tepat akan lebih disukai, tetapi skrip ini dapat dibuat jauh lebih efisien dan membaca waktu pembuatan beberapa file / inode.
[isi stap_stat.sh]
#/bin/sh
my_inode_str=$(stat --printf="%i" $1)
stap - << end_of_stap_script
global my_offsetof
probe begin {
system("stat $1");
my_offsetof = &@cast(0,"struct ext4_inode_info")->vfs_inode;
}
probe kernel.function("ext4_getattr@fs/ext4/inode.c") {
probe_inode=\$dentry->d_inode;
if (@cast(probe_inode, "struct inode")->i_ino == $my_inode_str) {
my_i_crtime = &@cast(probe_inode - my_offsetof,"struct ext4_inode_info")->i_crtime;
printf("CrTime: %s GMT\n", ctime(@cast(my_i_crtime, "timespec")->tv_sec));
printf("CrTime (nsecs): %d\n", @cast(my_i_crtime, "timespec")->tv_nsec);
exit();
}
}
end_of_stap_script
Ini demo:
$ ll testfile
ls: cannot access testfile: No such file or directory
$ touch testfile
$ ./stap_stat.sh testfile
File: ‘testfile’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd02h/64770d Inode: 4850501 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1001/ Rick) Gid: ( 1001/ Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:17:04.221441084 -0400
Modify: 2013-09-28 06:17:04.221441084 -0400
Change: 2013-09-28 06:17:04.221441084 -0400
Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$ ll testfile
-rw-rw-r--. 1 Rick Rick 0 Sep 28 06:17 testfile
$ cat - >> testfile
Now is the time ...
$ ll testfile
-rw-rw-r--. 1 Rick Rick 20 Sep 28 06:18 testfile
$ ./stap_stat.sh testfile
File: ‘testfile’
Device: fd02h/64770d Inode: 4850501 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1001/ Rick) Gid: ( 1001/ Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:17:04.221441084 -0400
Modify: 2013-09-28 06:18:33.684374740 -0400
Change: 2013-09-28 06:18:33.684374740 -0400
Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$ cat testfile
Now is the time ...
$ ./stap_stat.sh testfile
File: ‘testfile’
Size: 20 Blocks: 8 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 4850501 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1001/ Rick) Gid: ( 1001/ Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:19:12.199349463 -0400
Modify: 2013-09-28 06:18:33.684374740 -0400
Change: 2013-09-28 06:18:33.684374740 -0400
Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$ mv testfile testfile2
$ ./stap_stat.sh testfile2
File: ‘testfile2’
Size: 20 Blocks: 8 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 4850501 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1001/ Rick) Gid: ( 1001/ Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:19:12.199349463 -0400
Modify: 2013-09-28 06:18:33.684374740 -0400
Change: 2013-09-28 06:20:45.870295668 -0400
Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$
debugfs + stat
memungkinkan untuk mendapatkan crtime
tanpa monyet menambal kernel.
Di ext4
dalamnya dimungkinkan; karena ext4
file-system menyimpan waktu pembuatan file. Tapi tetap saja, Anda akan menemukan bahwa stat
perintah tidak dapat menampilkan tanggal, karena saya pikir kernel tidak memiliki API untuk ini.
Bagaimanapun, waktu kelahiran file disimpan ext4
dan Anda dapat menemukannya, meskipun tidak dengan metode langsung, tetapi dengan menggunakandebugfs
sudo debugfs -R "stat / ABSOLUTE / PATH" / dev / sdxX | grep crtime
xstat filename
/dev/sdxX
sudah di-mount /some/path
dan file-nya /some/path/some/file
, path yang ditentukan hanyalah some/file
: path-nya harus dirujuk bukan ke root filesystem, tetapi ke mountpoint. Jika tidak, file tidak akan ditemukan.
Secara teori, dengan stat GNU Anda dapat menggunakan stat -c '%w'
atau %W
untuk mendapatkan tanggal pembuatan file (alias waktu lahir).
Dalam praktiknya, sebagian besar sistem file tidak mencatat informasi itu dan kernel linux tidak menyediakan cara untuk mengaksesnya.
Waktu terdekat yang bisa Anda dapatkan adalah waktu file, yang bukan waktu pembuatannya, ini adalah waktu metadata file terakhir kali diubah.
Linux Weekly News memiliki artikel yang menarik tentang ini beberapa tahun yang lalu - http://lwn.net/Articles/397442/
stat --printf='%w' yourfile #human readable
stat --printf='%W' yourfile #seconds from Epoch , 0 if unknown
Perbedaan antara FreeBSD
dan GNU\Linux
pada stat command
:
Jika Anda memanggil stat
perintah di GNU\Linux
dalamnya memanggil -x
opsi, tetapi di FreeBSD, Anda sendiri yang harus memanggil -x
opsi.
Lihat juga Sistem file apa di Linux yang menyimpan waktu pembuatan?
Catatan: --printf
sangat berguna dalam scripting
....!
Di OS X Anda bisa menggunakan ls -lU
, stat -f%B
, GetFileInfo -d
, atau mdls -n kMDItemFSCreationDate
:
$ ls -lU
total 0
-rw-r--r-- 1 lauri staff 0 Apr 25 03:58 a
$ stat -f%B a
1398387538
$ stat -f%SB -t %Y%m%d%H%M a
201404250358
$ GetFileInfo -d a
04/25/2014 03:58:58
$ mdls -n kMDItemFSCreationDate a
kMDItemFSCreationDate = 2014-04-25 00:58:58 +0000
Lihat ini:
# the last arg is the device to scan in.
debugfs -R 'stat /home/renich/somefile' /dev/sda1
BTW, ini hanya berfungsi pada ext4. Saya belum menemukan solusi untuk BtrFS ... belum;)
stat(1)
.