फाइल की निर्माण तिथि कैसे पता करें?


104

मैं किसी विशेष फ़ाइल की निर्माण तिथि का पता लगाना चाहता हूं, न कि संशोधन की तारीख या अभिगमन तिथि।

मैं के साथ की कोशिश की है ls -ltrhऔर stat filename


5
लिनक्स सृजन समय का ट्रैक नहीं रखता है क्योंकि यह POSIX द्वारा आवश्यक नहीं है। हालांकि, मैक ओएस एक्स एचएफएस फाइलसिस्टम के साथ करता है - अंदर "जन्म समय" के तहत देखें stat(1)
200_सेफ़

2
फेडोरा 19 ext4 फाइलसिस्टम फाइल निर्माण समय निर्धारित करते हैं। मुझे यकीन है कि कई और उदाहरण हैं। नीचे दिए गए उत्तर देखें जो stapनिर्माण समय को पुनः प्राप्त करने का उपयोग करता है।
rickhg12hs

जवाबों:


88

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, फ़ाइल निर्माण समय को विस्तारित फ़ाइल विशेषताओं के माध्यम से उजागर करते हैं।


4
लिनक्स पर, यह अब ext4 सहित कई फाइल सिस्टम में संग्रहीत है। हालांकि इसे प्राप्त करने के लिए अभी तक कोई कर्नेल एपीआई नहीं है। फ्यूज पर ntfs-3G जैसी कुछ फाइल सिस्टम इसे विस्तारित विशेषता API के माध्यम से उपलब्ध
कराते हैं

@StephaneChazelas आपकी टिप्पणी के लिए धन्यवाद। अधिक विवरण प्रदान करने के लिए उत्तर का अद्यतन करें।
थॉमस न्यूमैन

आप stapअपनी खुद की कर्नेल एपीआई बनाने के लिए उपयोग कर सकते हैं । उत्तर में उदाहरण देखें।
rickhg12hs

26

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
$ 

4
ठीक है, यह सिर्फ अच्छा है। + 1 स्टैप का उपयोग करने के लिए, बंदर ने लिनक्स कर्नेल को पैच किया, भयानक।
क्रिस मैग्नसन

@ क्रिसमग्नसन: कर्नेल को बंदर के बिना debugfs + statप्राप्त करने की अनुमति दें crtime
JFS

17

इसमें ext4संभव है; क्योंकि ext4फ़ाइल-सिस्टम फ़ाइल निर्माण समय संग्रहीत करता है। लेकिन फिर भी, आप पाएंगे कि statआदेश दिनांक दिखाने में असमर्थ है, क्योंकि मुझे लगता है कि कर्नेल के पास इसके लिए कोई एपीआई नहीं है।

वैसे भी, फ़ाइल का जन्म समय संग्रहीत है ext4और आप इसका पता लगा सकते हैं, हालांकि एक सीधी विधि द्वारा नहीं, बल्कि उपयोग करकेdebugfs

sudo debugfs -R "stat / ABSOLUTE / PATH" / dev / sdxX | क्रेप समय


1
: एक पार्टी समारोह के रूप मेंxstat filename
JFS

1
यदि फ़ाइल /dev/sdxXको माउंट किया गया है /some/pathऔर फ़ाइल है /some/path/some/file, तो निर्दिष्ट किया जाने वाला पथ केवल है some/file: इसका पथ फ़ाइल सिस्टम रूट को नहीं, बल्कि माउंटपॉइंट को भेजा जाना चाहिए। अन्यथा, फ़ाइल नहीं मिलेगी।
बोवपार्क

15

सिद्धांत रूप में, जीएनयू स्टैट के साथ आप फाइल के निर्माण की तारीख (उर्फ जन्म समय) का उपयोग stat -c '%w'या %Wप्राप्त कर सकते हैं ।

व्यवहार में, अधिकांश फाइल सिस्टम उस जानकारी को रिकॉर्ड नहीं करते हैं और लिनक्स कर्नेल इसे एक्सेस करने का कोई तरीका प्रदान नहीं करता है।

निकटतम आप प्राप्त कर सकते हैं फ़ाइल के ctime, जो है नहीं निर्माण के समय, यह समय है कि फ़ाइल के मेटाडाटा पिछले बदल गया था है।

लिनक्स वीकली न्यूज ने कुछ साल पहले इस बारे में एक दिलचस्प लेख लिखा था - http://lwn.net/Articles/397442/


7
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....!


//, एक CEntOS 6 मशीन पर यह करने की कोशिश की, और मैं सब मिल गया सवालिया निशान था: $ stat --printf = '% w' ~ / डंप .rdb? शायद मेरा फाइल सिस्टम% w के साथ स्टेट को सपोर्ट नहीं करता है।
नाथन बसानी

दुर्भाग्य से, HFS ctime का समर्थन नहीं करता है।
फ़ारसीगुल्फ़

5

ओएस एक्स में आप उपयोग कर सकते हैं 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

2

इसकी जांच करें:

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

BTW, यह केवल ext4 पर काम करता है। मुझे BtrFS के लिए कोई समाधान नहीं मिला ... अभी तक;)


1
यह बहुत ज्यादा है जो शुरुआत का जवाब कहता है ... है ना?
दान_क्रांति

वूप्स, आप सही हैं @don_crissti
Renich
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.