Bagaimana menemukan tanggal pembuatan file?

104

Saya ingin mengetahui tanggal pembuatan file tertentu, bukan tanggal modifikasi atau tanggal akses.

Saya sudah mencoba ls -ltrhdan stat filename.

Özzesh
sumber
5
Linux tidak melacak waktu pembuatan karena tidak diperlukan oleh POSIX. Namun, Mac OS X tidak dengan sistem file HFS - lihat di bawah "waktu kelahiran" di stat(1).
200_success
2
Sistem file Fedora 19 ext4 memang mengatur waktu pembuatan file. Saya yakin ada banyak contoh lagi. Lihat jawaban di bawah yang digunakan stapuntuk mengambil waktu pembuatan.
rickhg12hs

Jawaban:

88

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 ( crtimedalam ext4, otimedalam 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 , statmendukung %wdan %Wmemformat penspesifikasi untuk menampilkan waktu kelahiran file (dalam format yang dapat dibaca manusia dan dalam hitungan detik sejak masing-masing zaman). Namun, statitu sendiri mengakses waktu kelahiran melalui yang get_stat_birthtime()disediakan oleh gnulib (dalam lib/stat-time.h), yang mendapat waktu lahir dari st_birthtimedan st_birthtimensecbidang statstruktur dikembalikan oleh stat()panggilan sistem. Sementara misalnya sistem BSD (dan dalam ekstensi OS X) menyediakan st_birthtimemelalui stat, Linux tidak. Inilah sebabnya mengapa stat -c '%w' fileoutput -(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.

Thomas Nyman
sumber
4
Di Linux, sekarang disimpan di banyak filesystem termasuk ext4. Belum ada API kernel untuk mendapatkannya. Beberapa sistem file seperti ntfs-3g over fuse membuatnya tersedia melalui API atribut diperluas
Stéphane Chazelas
@StephaneChazelas Terima kasih atas komentar Anda. Diperbarui jawabannya untuk memberikan rincian lebih lanjut.
Thomas Nyman
Anda dapat menggunakan stapuntuk membuat API kernel Anda sendiri. Lihat contoh dalam jawaban di sini.
rickhg12hs
26

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 statoutput 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
$ 
rickhg12hs
sumber
4
Ok, itu keren sekali. +1 untuk menggunakan stap, monyet menambal kernel linux, luar biasa.
Chris Magnuson
@ChrisMagnuson: debugfs + statmemungkinkan untuk mendapatkan crtimetanpa monyet menambal kernel.
jfs
17

Di ext4dalamnya dimungkinkan; karena ext4file-system menyimpan waktu pembuatan file. Tapi tetap saja, Anda akan menemukan bahwa statperintah tidak dapat menampilkan tanggal, karena saya pikir kernel tidak memiliki API untuk ini.

Bagaimanapun, waktu kelahiran file disimpan ext4dan Anda dapat menemukannya, meskipun tidak dengan metode langsung, tetapi dengan menggunakandebugfs

sudo debugfs -R "stat / ABSOLUTE / PATH" / dev / sdxX | grep crtime

pemula
sumber
1
sebagai fungsi bash:xstat filename
jfs
1
Jika /dev/sdxXsudah di-mount /some/pathdan 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.
BowPark
15

Secara teori, dengan stat GNU Anda dapat menggunakan stat -c '%w'atau %Wuntuk 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/

cas
sumber
7
stat --printf='%w' yourfile   #human readable

stat --printf='%W' yourfile   #seconds from Epoch , 0 if unknown

Perbedaan antara FreeBSDdan GNU\Linuxpada stat command:

Jika Anda memanggil statperintah di GNU\Linuxdalamnya memanggil -x opsi, tetapi di FreeBSD, Anda sendiri yang harus memanggil -xopsi.

Lihat juga Sistem file apa di Linux yang menyimpan waktu pembuatan?

Catatan: --printf sangat berguna dalam scripting....!

Teluk Persia
sumber
//, Sudah mencoba ini pada mesin CEntOS 6, dan yang saya dapatkan hanyalah tanda tanya: $ stat --printf = '% w' ~ / dump.rdb? Mungkin sistem file saya tidak mendukung stat dengan% w.
Nathan Basanese
Sayangnya, HFS tidak mendukung ctime.
PersianGulf
5

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
Lri
sumber
2

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;)

Renich
sumber
1
Itu cukup banyak apa jawaban pemula mengatakan ... bukan?
don_crissti
wah, kau benar @don_crissti
Renich