আমি নির্দিষ্ট ফাইল তৈরির তারিখটি জানতে চাই, পরিবর্তনের তারিখ বা অ্যাক্সেসের তারিখ নয়।
আমি চেষ্টা করেছি ls -ltrh
এবং stat filename
।
stap
তৈরির সময় পুনরুদ্ধার করতে ব্যবহার করে।
আমি নির্দিষ্ট ফাইল তৈরির তারিখটি জানতে চাই, পরিবর্তনের তারিখ বা অ্যাক্সেসের তারিখ নয়।
আমি চেষ্টা করেছি ls -ltrh
এবং stat filename
।
stap
তৈরির সময় পুনরুদ্ধার করতে ব্যবহার করে।
উত্তর:
পসিক্স স্ট্যান্ডার্ডটি প্রতিটি ফাইলের জন্য সংরক্ষণ করার জন্য কেবল তিনটি স্বতন্ত্র টাইমস্ট্যাম্পগুলি সংজ্ঞায়িত করে : শেষ ডেটা অ্যাক্সেসের সময়, শেষ ডেটা সংশোধন করার সময় এবং ফাইলের স্থিতি সর্বশেষ পরিবর্তনের সময়।
এটি বলেছিল, আধুনিক লিনাক্স ফাইল সিস্টেমগুলি, যেমন ext4, বিটিআরএফ এবং জেএফএস, ফাইল তৈরির সময় (ওরফে জন্মের সময়) সংরক্ষণ করে তবে প্রশ্নে ক্ষেত্রের জন্য আলাদা আলাদা নাম ব্যবহার করে ( crtime
এক্সট্রুটে, otime
বিটিআরএফএস এবং জেএফএসে)। যাইহোক, বর্তমানে লিনাক্স ফাইল তৈরির সময়গুলি অ্যাক্সেস করার জন্য কার্নেল এপিআই সরবরাহ করে না , এমনকি তাদের সমর্থনকারী ফাইল সিস্টেমগুলিতেও।
ক্রেগ স্যান্ডার্স এবং মহসেন পাহলেভানজাদেহ যেহেতু উল্লেখ করেছেন, ফাইলের জন্মের সময়টি প্রদর্শন করার জন্য (যথাক্রমে মানব পাঠযোগ্য বিন্যাসে এবং কয়েক সেকেন্ডে যথাক্রমে) ফাইলের জন্মের সময় প্রদর্শন করার জন্য এবং বিন্যাস নির্দিষ্টকরণগুলিকে stat
সমর্থন করে । তবে, গনুলিব (ইন ) দ্বারা প্রদত্ত মাধ্যমে জন্মের সময়টি নিজেই অ্যাক্সেস করে , যা সিস্টেম কল দ্বারা ফিরে আসা কাঠামোর ক্ষেত্রগুলি এবং ক্ষেত্রগুলি থেকে জন্মের সময় পায় । উদাহরণস্বরূপ, বিএসডি সিস্টেমগুলি (এবং এক্সটেনশনে ওএস এক্স) এর মাধ্যমে সরবরাহ করে , লিনাক্স দেয় না। এই কারণেই লিনাক্সে আউটপুটগুলি (কোনও অজানা সৃষ্টির সময় নির্দেশ করে) এমনকী এমন ফাইল সিস্টেমগুলির জন্য যা সৃষ্টির সময়টি অভ্যন্তরীণভাবে সংরক্ষণ করে।%w
%W
stat
get_stat_birthtime()
lib/stat-time.h
st_birthtime
st_birthtimensec
stat
stat()
st_birthtime
stat
stat -c '%w' file
-
স্টিফেন চেজেলাস যেমন উল্লেখ করেছেন , কিছু ফাইল সিস্টেম যেমন এনটিএফএস -3 জি প্রসারিত ফাইল বৈশিষ্ট্যের মাধ্যমে ফাইল তৈরির সময় প্রকাশ করে।
stap
নিজের কার্নেল এপিআই তৈরি করতে ব্যবহার করতে পারেন । উত্তরের উদাহরণ দেখুন।
TLDR; আপনার নিজস্ব কার্নেল এপিআই তৈরি করতে stap
( "সিস্টেমট্যাপ" ) ব্যবহার করুন । নীচে ext4 তৈরির সময় নিষ্কাশন এর ডেমো।
আপনি ফেডোরা 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
এটি স্পষ্ট যে আমার এক্সট 4 পার্টিশনের ইনোডগুলির তৈরির সময় রয়েছে। এখানে একটি শেল স্ক্রিপ্ট যা কোনও ফাইলের সাথে সম্পর্কিত ইনোড নির্ধারণ করে এবং তারপরে ("সিস্টেমট্যাপ") stat
ব্যবহার করে আউটপুটকে তৈরির সময় stap
বাড়িয়ে তোলে।
এনবি: এটি কেবল একটি ডেমো এবং অত্যন্ত কার্যকরভাবে যেহেতু প্রতিটি সম্পাদনের জন্য কার্নেল মডিউল তৈরি করা, লোড করা এবং আনলোড করা হয়। কোনও ত্রুটি পরীক্ষা করার সময় এটি সম্ভবত খুব নাজুক। একটি সঠিক কার্নেল এপিআই পছন্দনীয় হবে তবে এই স্ক্রিপ্টটি আরও কার্যকর করা যায় এবং একাধিক ফাইল / ইনোড তৈরির সময় পড়তে পারে।
[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
বিকল্পটি চাওয়া হয় , তবে ফ্রিবিএসডি-তে, আপনাকে নিজেরাই -x
বিকল্পটি চাওয়া উচিত ।
আরও দেখুন লিনাক্সের কোন ফাইল সিস্টেমগুলি তৈরির সময় সংরক্ষণ করে?
দ্রষ্টব্য: এতে --printf
খুব দরকারী scripting
....!
OS X এর মধ্যে আপনি ব্যবহার করতে পারেন 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
বিটিডাব্লু, এটি কেবল এক্সট্রা 4 এ কাজ করে। আমি এখনও বিটিআরএসএফ ... এর সমাধান খুঁজে পাইনি;)
stat(1)
।