मैं किसी विशेष फ़ाइल की निर्माण तिथि का पता लगाना चाहता हूं, न कि संशोधन की तारीख या अभिगमन तिथि।
मैं के साथ की कोशिश की है ls -ltrh
और stat filename
।
stap
निर्माण समय को पुनः प्राप्त करने का उपयोग करता है।
मैं किसी विशेष फ़ाइल की निर्माण तिथि का पता लगाना चाहता हूं, न कि संशोधन की तारीख या अभिगमन तिथि।
मैं के साथ की कोशिश की है ls -ltrh
और stat filename
।
stap
निर्माण समय को पुनः प्राप्त करने का उपयोग करता है।
जवाबों:
POSIX मानक केवल प्रत्येक फ़ाइल के लिए संग्रहीत किए जाने वाले तीन अलग-अलग टाइमस्टैम्प्स को परिभाषित करता है : अंतिम डेटा एक्सेस का समय, अंतिम डेटा संशोधन का समय और फ़ाइल का समय अंतिम बदल गया।
उस ने कहा, आधुनिक Linux फाइलसिस्टम, जैसे ext4, Btrfs और JFS, फ़ाइल निर्माण समय (उर्फ जन्म समय) को संग्रहीत करते हैं , लेकिन प्रश्न में क्षेत्र के लिए अलग-अलग नामों का उपयोग करते हैं ( crtime
ext4 में, otime
Btrfs और JFS में)। हालाँकि, वर्तमान में लिनक्स फ़ाइल निर्माण समय तक पहुँचने के लिए कर्नेल एपीआई प्रदान नहीं करता है , यहाँ तक कि उनका समर्थन करने वाले फाइल सिस्टम पर भी।
के रूप में क्रेग सैंडर्स और मोहसिन Pahlevanzadeh ने कहा, stat
समर्थन नहीं करता %w
और %W
(क्रमशः मानव पठनीय प्रारूप में और युग के बाद से सेकंड में) फ़ाइल जन्म समय प्रदर्शित करने के लिए प्रारूप विनिर्देशक। हालांकि, stat
खुद के माध्यम से जन्म समय तक पहुँचता get_stat_birthtime()
gnulib (में द्वारा प्रदान की lib/stat-time.h
), जिसमें से जन्म समय हो जाता है st_birthtime
और st_birthtimensec
के क्षेत्र stat
संरचना द्वारा लौटाए stat()
सिस्टम कॉल। उदाहरण के लिए बीएसडी सिस्टम (और विस्तार में ओएस एक्स) के st_birthtime
माध्यम से प्रदान करते हैं stat
, लिनक्स नहीं करता है। यही कारण है कि फाइल सिस्टम के लिए भी लिनक्स पर stat -c '%w' file
आउटपुट -
(एक अज्ञात निर्माण समय का संकेत) जो निर्माण समय को आंतरिक रूप से संग्रहीत करते हैं।
जैसा कि स्टीफन चेज़लस बताते हैं , कुछ फाइल सिस्टम, जैसे कि ntfs-3G, फ़ाइल निर्माण समय को विस्तारित फ़ाइल विशेषताओं के माध्यम से उजागर करते हैं।
stap
अपनी खुद की कर्नेल एपीआई बनाने के लिए उपयोग कर सकते हैं । उत्तर में उदाहरण देखें।
TLDR; का प्रयोग करें stap
( "SystemTap" अपनी खुद की गिरी एपीआई बनाने के लिए)। नीचे ext4 निर्माण समय निष्कर्षण का डेमो।
आप Fedora 19 सिस्टम पर ext4 निर्माण समय निकाल सकते हैं। ये मेरा:
$ 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 विभाजन पर इनोड्स का निर्माण समय है। यहाँ एक शेल स्क्रिप्ट है जो एक फ़ाइल नाम के साथ जुड़े इनोड को निर्धारित करता है और फिर ("सिस्टमटैप") stat
का उपयोग करके निर्माण समय के साथ आउटपुट को बढ़ाता है stap
।
NB: यह सिर्फ एक डेमो और बेहद अक्षम है क्योंकि कर्नेल मॉड्यूल को बनाया जाता है, लोड किया जाता है, और हर निष्पादन के लिए अनलोड किया जाता है। यह भी शायद बहुत नाजुक है क्योंकि कोई त्रुटि जाँच नहीं की जाती है। एक उचित कर्नेल एपीआई बेहतर होगा, लेकिन इस स्क्रिप्ट को बहुत अधिक कुशल बनाया जा सकता है और कई फाइलों / आयतों के निर्माण समय को पढ़ा जा सकता है।
[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
यहाँ एक डेमो है:
$ 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
प्राप्त करने की अनुमति दें crtime
।
इसमें ext4
संभव है; क्योंकि ext4
फ़ाइल-सिस्टम फ़ाइल निर्माण समय संग्रहीत करता है। लेकिन फिर भी, आप पाएंगे कि stat
आदेश दिनांक दिखाने में असमर्थ है, क्योंकि मुझे लगता है कि कर्नेल के पास इसके लिए कोई एपीआई नहीं है।
वैसे भी, फ़ाइल का जन्म समय संग्रहीत है ext4
और आप इसका पता लगा सकते हैं, हालांकि एक सीधी विधि द्वारा नहीं, बल्कि उपयोग करकेdebugfs
sudo debugfs -R "stat / ABSOLUTE / PATH" / dev / sdxX | क्रेप समय
xstat filename
/dev/sdxX
को माउंट किया गया है /some/path
और फ़ाइल है /some/path/some/file
, तो निर्दिष्ट किया जाने वाला पथ केवल है some/file
: इसका पथ फ़ाइल सिस्टम रूट को नहीं, बल्कि माउंटपॉइंट को भेजा जाना चाहिए। अन्यथा, फ़ाइल नहीं मिलेगी।
सिद्धांत रूप में, जीएनयू स्टैट के साथ आप फाइल के निर्माण की तारीख (उर्फ जन्म समय) का उपयोग stat -c '%w'
या %W
प्राप्त कर सकते हैं ।
व्यवहार में, अधिकांश फाइल सिस्टम उस जानकारी को रिकॉर्ड नहीं करते हैं और लिनक्स कर्नेल इसे एक्सेस करने का कोई तरीका प्रदान नहीं करता है।
निकटतम आप प्राप्त कर सकते हैं फ़ाइल के ctime, जो है नहीं निर्माण के समय, यह समय है कि फ़ाइल के मेटाडाटा पिछले बदल गया था है।
लिनक्स वीकली न्यूज ने कुछ साल पहले इस बारे में एक दिलचस्प लेख लिखा था - http://lwn.net/Articles/397442/
stat --printf='%w' yourfile #human readable
stat --printf='%W' yourfile #seconds from Epoch , 0 if unknown
पर FreeBSD
और बीच का अंतर :GNU\Linux
stat command
यदि आप इसमें stat
कमांड कहते हैं , GNU\Linux
तो -x
विकल्प को आमंत्रित करता है, लेकिन FreeBSD में, आपको स्वयं -x
विकल्प को आमंत्रित करना चाहिए ।
यह भी देखें कि लिनक्स पर कौन से फाइल सिस्टम निर्माण समय को स्टोर करते हैं?
नोट: --printf
बहुत उपयोगी है scripting
....!
ओएस एक्स में आप उपयोग कर सकते हैं ls -lU
, stat -f%B
, GetFileInfo -d
, या 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
इसकी जांच करें:
# the last arg is the device to scan in.
debugfs -R 'stat /home/renich/somefile' /dev/sda1
BTW, यह केवल ext4 पर काम करता है। मुझे BtrFS के लिए कोई समाधान नहीं मिला ... अभी तक;)
stat(1)
।