Dosyanın oluşturulma tarihi nasıl bulunur?


104

Belirli bir dosyanın oluşturulma tarihini, değişiklik tarihini veya erişim tarihini öğrenmek istemiyorum.

Birlikte çalıştık ls -ltrhve stat filename.


5
Linux, POSIX tarafından gerekli olmadığından oluşturma süresini takip etmez. Ancak, Mac OS X, HFS dosya sistemini kullanır - içindeki "doğum zamanı" bölümüne bakın stat(1).
200_success

2
Fedora 19 ext4 dosya sistemleri dosya oluşturma sürelerini belirler. Eminim çok daha fazla örnek var. stapOluşturma zamanlarını almak için kullanılan cevaplara bakınız .
rickhg12hs

Yanıtlar:


88

POSIX standardı yalnızca her dosya için depolanacak üç ayrı zaman damgası tanımlar : son veri erişiminin zamanı, son veri değişikliğinin saati ve dosya durumunun en son değiştirildiği saat.

Buna göre, ext4, Btrfs ve JFS gibi modern Linux dosya sistemleri, dosya oluşturma zamanını (aka doğum zamanı) saklar , ancak söz konusu alan için farklı adlar kullanır ( crtimeext4'te, otimeBtrfs ve JFS'de). Ancak, şu anda Linux, dosya oluşturma sürelerine erişmek için , onları destekleyen dosya sistemlerinde bile bir çekirdek API sağlamaz .

As Craig Sanders ve Mohsen Pahlevanzadeh işaret, statdestekliyor %wve %W(sırasıyla insan okunabilir formatta ve Epoch'tan beri saniye cinsinden) dosya doğum zamanı görüntülenmesine ilişkin biçim belirteci. Bununla birlikte, statdoğum zamanına , sistem çağrısı tarafından döndürülen yapının alanlarından ve doğum alanını alan get_stat_birthtime()gnulib (in lib/stat-time.h) tarafından sağlanan doğum yoluyla erişir . Örneğin BSD sistemleri (ve uzantı OS X) üzerinden sağlarken , Linux sağlamaz. Bu nedenle , oluşturma süresini dahili olarak depolayan dosya sistemlerinde bile Linux'ta çıktıların (bilinmeyen bir oluşturma süresi olduğunu gösterir) gösterir.st_birthtimest_birthtimensecstatstat()st_birthtimestatstat -c '%w' file-

As Stephane Chazelas işaret , bu tür ntfs-3g gibi bazı dosya sistemleri, genişletilmiş dosya öznitelikleri aracılığıyla dosya oluşturma süreleri maruz.


4
Linux'ta, şimdi ext4 de dahil olmak üzere birçok dosya sisteminde depolanır. Henüz almak için henüz çekirdek API yok. Ntfs-3g üstü sigorta gibi bazı dosya sistemleri, genişletilmiş API
Stéphane Chazelas

@StephaneChazelas Yorumlarınız için teşekkür ederiz. Daha fazla ayrıntı sağlamak için cevap güncellendi.
Thomas Nyman

stapKendi çekirdek API'nizi oluşturmak için kullanabilirsiniz . Buradaki cevaba bakınız.
rickhg12hs

26

TLDR; Kullan stap( "SystemTap'ı" Kendi çekirdek API oluşturmak için). Ext4 oluşturma zamanı çıkarımının aşağıda gösterilmesi.

Ext4 oluşturma zamanlarını Fedora 19 sistemlerinde çıkarabilirsiniz. Benimki burada:

$ 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

Ext4 bölümlerimdeki inodeların yaratılma zamanının olduğu açık. Burada bir dosya adıyla ilişkili inode'u belirleyen ve daha sonra ("systemtap") statkullanarak çıktıyı oluşturma süresini arttıran bir kabuk betiği verilmiştir stap.

Not: Her uygulama için bir çekirdek modülü oluşturulduğundan, yüklendiğinden ve boşaltıldığından bu sadece bir demo ve son derece verimsizdir. Hata kontrolü yapılmadığı için bu muhtemelen çok kırılgandır. Uygun bir çekirdek API tercih edilir, ancak bu komut dosyası daha verimli hale getirilebilir ve birden fazla dosya / inode oluşturma zamanını okuyabilir.

[stap_stat.sh içeriği]

#/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

İşte bir 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
$ 

4
Tamam, bu sadece harika. Kullanmak için +1 linux çekirdeği yama, maymun, harika.
Chris Magnuson

@ChrisMagnuson: çekirdeği yamadan maymun debugfs + statalmayı crtimesağlar.
jfs

17

İçinde ext4mümkün; çünkü ext4dosya sistemi dosyanın oluşturulma zamanını depolar. Ama yine de, statkomutun tarihi gösteremediğini göreceksiniz , çünkü çekirdeğin bunun için herhangi bir API'si olmadığını düşünüyorum.

Her neyse, dosya doğum zamanı saklanır ext4ve doğrudan bir yöntemle değil, kullanarakdebugfs

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


1
bash işlevi olarak:xstat filename
jfs

1
Eğer /dev/sdxXmonte edilmişse /some/pathve dosya ise /some/path/some/file, belirtilecek yol sadece some/file: yolu dosya sistemi köküne değil, bağlama noktasına yönlendirilmelidir. Aksi takdirde, dosya bulunmayacak.
BowPark

15

Teoride, GNU stat ile bir dosyanın oluşturulma tarihini (aka doğum zamanı) kullanabilir stat -c '%w'veya %Welde edebilirsiniz.

Uygulamada, çoğu dosya sistemi bu bilgiyi kaydetmez ve linux çekirdeği bu bilgilere erişim için bir yol sağlamaz.

Alabileceğiniz en yakın dosya zamanıdır, bu dosya oluşturma zamanı değil , dosyanın meta verilerinin en son değiştirildiği zamandır.

Linux Weekly News'in bundan birkaç yıl önce ilginç bir makalesi vardı - http://lwn.net/Articles/397442/


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

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

Arasındaki fark FreeBSDve GNU\Linuxüzerinde stat command:

Eğer statkomutu GNU\Linuxçağırırsanız -x seçeneği çağırırsınız , fakat FreeBSD'de bu -xseçeneği kendiniz çağırmalısınız .

Ayrıca bakınız Linux'ta hangi dosya sistemleri oluşturma süresini saklar?

Notlar: --printf Çok yararlıdır scripting....!


//, bunu bir CEntOS 6 makinesinde denedim ve tüm sahip olduğum soru işaretleri oldu: $ stat --printf = '% w' ~ / dump.rdb? Belki de dosya sistemim% w stat statüsünü desteklemiyor.
Nathan Basanese,

maalesef, HFS ctime desteklemiyor.
PersianGulf

5

OS X'te kullanabilirsiniz ls -lU, stat -f%B, GetFileInfo -d, veya 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

2

Şuna bir bak:

# the last arg is the device to scan in.
debugfs -R 'stat /home/renich/somefile' /dev/sda1

Btw, bu sadece ext4 üzerinde çalışır. BtrFS için bir çözüm bulamadım ... henüz;)


1
Bu, yeni başlayanların cevabının söylediği şey ... değil mi?
don_crissti

ağrıyor, haklısın @don_crissti
Renich
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.