Belirli bir dosyanın oluşturulma tarihini, değişiklik tarihini veya erişim tarihini öğrenmek istemiyorum.
Birlikte çalıştık ls -ltrh
ve stat filename
.
stap
Oluş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 -ltrh
ve stat filename
.
stap
Oluş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 ( crtime
ext4'te, otime
Btrfs 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, stat
destekliyor %w
ve %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, stat
doğ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_birthtime
st_birthtimensec
stat
stat()
st_birthtime
stat
stat -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.
stap
Kendi ç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") stat
kullanarak çı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 + stat
almayı crtime
sağlar.
İçinde ext4
mümkün; çünkü ext4
dosya sistemi dosyanın oluşturulma zamanını depolar. Ama yine de, stat
komutun 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 ext4
ve doğrudan bir yöntemle değil, kullanarakdebugfs
sudo debugfs -R "stat / ABSOLUTE / PATH" / dev / sdxX | grep crtime
xstat filename
/dev/sdxX
monte edilmişse /some/path
ve 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 %W
elde 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 FreeBSD
ve GNU\Linux
üzerinde stat command
:
Eğer stat
komutu GNU\Linux
çağırırsanız -x
seçeneği çağırırsınız , fakat FreeBSD'de bu -x
seç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)
.