मैं किसी विशेष फ़ाइल की निर्माण तिथि का पता लगाना चाहता हूं, न कि संशोधन की तारीख या अभिगमन तिथि।
मैं के साथ की कोशिश की है ls -ltrhऔर stat filename।
stapनिर्माण समय को पुनः प्राप्त करने का उपयोग करता है।
मैं किसी विशेष फ़ाइल की निर्माण तिथि का पता लगाना चाहता हूं, न कि संशोधन की तारीख या अभिगमन तिथि।
मैं के साथ की कोशिश की है ls -ltrhऔर stat filename।
stapनिर्माण समय को पुनः प्राप्त करने का उपयोग करता है।
जवाबों:
POSIX मानक केवल प्रत्येक फ़ाइल के लिए संग्रहीत किए जाने वाले तीन अलग-अलग टाइमस्टैम्प्स को परिभाषित करता है : अंतिम डेटा एक्सेस का समय, अंतिम डेटा संशोधन का समय और फ़ाइल का समय अंतिम बदल गया।
उस ने कहा, आधुनिक Linux फाइलसिस्टम, जैसे ext4, Btrfs और JFS, फ़ाइल निर्माण समय (उर्फ जन्म समय) को संग्रहीत करते हैं , लेकिन प्रश्न में क्षेत्र के लिए अलग-अलग नामों का उपयोग करते हैं ( crtimeext4 में, otimeBtrfs और 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\Linuxstat 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)।