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.
stapOluşturma zamanlarını almak için kullanılan cevaplara bakınız .
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.
stapOluşturma zamanlarını almak için kullanılan cevaplara bakınız .
Yanıtlar:
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.
stapKendi çekirdek API'nizi oluşturmak için kullanabilirsiniz . Buradaki cevaba bakınız.
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
$
debugfs + statalmayı crtimesağlar.
İç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
xstat filename
/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.
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/
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....!
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
Ş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;)
stat(1).