stat
निर्माण समय दिखाने में असमर्थता stat(2)
सिस्टम कॉल की सीमा के कारण है , जिसकी वापसी संरचना में निर्माण समय के लिए फ़ील्ड शामिल नहीं है। लिनक्स 4.11 (यानी, 17.10 और नए *) के साथ शुरू, हालांकि, नया statx(2)
सिस्टम कॉल उपलब्ध है, जिसमें इसकी वापसी संरचना में एक निर्माण समय शामिल है।
* और संभवतया पुराने एलटीएस पर हार्डवेयर सक्षमता स्टैक (एचडब्ल्यूई) गुठली का उपयोग करके रिलीज होता है। uname -r
यह देखने के लिए जांचें कि क्या आप पुष्टि करने के लिए कम से कम 4.11 पर कर्नेल का उपयोग कर रहे हैं।
दुर्भाग्य से, सिस्टम कॉल को सीधे सी प्रोग्राम में कॉल करना आसान नहीं है। आमतौर पर glibc एक आवरण प्रदान करता है जो काम को आसान बनाता है, लेकिन glibc ने केवल statx(2)
अगस्त 2018 (संस्करण 2.28 , 18.10 में उपलब्ध) के लिए एक आवरण जोड़ा । सौभाग्य से, @whotwagner ने एक नमूना C प्रोग्राम लिखा, जो दिखाता है कि statx(2)
x86 और x86-64 सिस्टम पर सिस्टम कॉल का उपयोग कैसे करें। इसका आउटपुट stat
बिना किसी फॉर्मेटिंग विकल्प के, डिफ़ॉल्ट के समान है , लेकिन इसे केवल जन्म समय प्रिंट करने के लिए संशोधित करना सरल है।
सबसे पहले, इसे क्लोन करें:
git clone https://github.com/whotwagner/statx-fun
आप statx.c
कोड को संकलित कर सकते हैं , या, यदि आप सिर्फ जन्म का समय चाहते हैं, तो birth.c
निम्न कोड के साथ क्लोन निर्देशिका में बनाएं (जो कि statx.c
नैनोस्कॉन्ड सटीक सहित निर्माण टाइमस्टैम्प की छपाई का एक न्यूनतम संस्करण है ):
#define _GNU_SOURCE
#define _ATFILE_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include "statx.h"
#include <time.h>
#include <getopt.h>
#include <string.h>
// does not (yet) provide a wrapper for the statx() system call
#include <sys/syscall.h>
/* this code works ony with x86 and x86_64 */
#if __x86_64__
#define __NR_statx 332
#else
#define __NR_statx 383
#endif
#define statx(a,b,c,d,e) syscall(__NR_statx,(a),(b),(c),(d),(e))
int main(int argc, char *argv[])
{
int dirfd = AT_FDCWD;
int flags = AT_SYMLINK_NOFOLLOW;
unsigned int mask = STATX_ALL;
struct statx stxbuf;
long ret = 0;
int opt = 0;
while(( opt = getopt(argc, argv, "alfd")) != -1)
{
switch(opt) {
case 'a':
flags |= AT_NO_AUTOMOUNT;
break;
case 'l':
flags &= ~AT_SYMLINK_NOFOLLOW;
break;
case 'f':
flags &= ~AT_STATX_SYNC_TYPE;
flags |= AT_STATX_FORCE_SYNC;
break;
case 'd':
flags &= ~AT_STATX_SYNC_TYPE;
flags |= AT_STATX_DONT_SYNC;
break;
default:
exit(EXIT_SUCCESS);
break;
}
}
if (optind >= argc) {
exit(EXIT_FAILURE);
}
for (; optind < argc; optind++) {
memset(&stxbuf, 0xbf, sizeof(stxbuf));
ret = statx(dirfd, argv[optind], flags, mask, &stxbuf);
if( ret < 0)
{
perror("statx");
return EXIT_FAILURE;
}
printf("%lld.%u\n", *&stxbuf.stx_btime.tv_sec, *&stxbuf.stx_btime.tv_nsec);
}
return EXIT_SUCCESS;
}
फिर:
$ make birth
$ ./birth ./birth.c
1511793291.254337149
$ ./birth ./birth.c | xargs -I {} date -d @{}
Mon Nov 27 14:34:51 UTC 2017
सिद्धांत रूप में, इससे सृजन का समय और अधिक सुलभ हो जाना चाहिए:
- अधिक फाइल सिस्टम को केवल ext * वाले की तुलना में समर्थित होना चाहिए (
debugfs
ext2 / 3/4 filesystems के लिए एक उपकरण है, और दूसरों के लिए अनुपयोगी है)
- आपको इसका उपयोग करने के लिए रूट की आवश्यकता नहीं है (कुछ आवश्यक पैकेजों, जैसे
make
और स्थापित करने के लिए छोड़कर linux-libc-dev
)।
उदाहरण के लिए, xfs सिस्टम का परीक्षण करना:
$ truncate -s 1G temp; mkfs -t xfs temp; mkdir foo; sudo mount temp foo; sudo chown $USER foo
$ touch foo/bar
$ # some time later
$ echo > foo/bar
$ chmod og-w foo/bar
$ ./birth foo/bar | xargs -I {} date -d @{}
Mon Nov 27 14:43:21 UTC 2017
$ stat foo/bar
File: foo/bar
Size: 1 Blocks: 8 IO Block: 4096 regular file
Device: 700h/1792d Inode: 99 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ muru) Gid: ( 1000/ muru)
Access: 2017-11-27 14:43:32.845579010 +0000
Modify: 2017-11-27 14:44:38.809696644 +0000
Change: 2017-11-27 14:44:45.536112317 +0000
Birth: -
हालाँकि, यह NTFS और एक्सफ़ैट के लिए काम नहीं करता था। मुझे लगता है कि उन लोगों के लिए FUSE फाइल सिस्टम में सृजन समय शामिल नहीं था।
यदि, या बल्कि जब, ग्लिबेक statx(2)
सिस्टम कॉल के लिए समर्थन जोड़ता है , stat
जल्द ही पालन करेगा और हम इसके लिए सादे पुराने stat
कमांड का उपयोग करने में सक्षम होंगे । लेकिन मुझे नहीं लगता कि यह एलटीएस रिलीज के लिए वापस किया जाएगा, भले ही वे नई गुठली प्राप्त करें। तो, मैं उम्मीद नहीं है stat
पर किसी भी वर्तमान LTS रिहाई कभी मैन्युअल हस्तक्षेप के बिना निर्माण के समय मुद्रित करने के लिए (14.04, 16.04 या 18.04)।
18.10 पर, हालांकि, आप सीधे statx
वर्णित फ़ंक्शन का उपयोग कर सकते हैं man 2 statx
(ध्यान दें कि 18.10 मैनपेज यह बताने में गलत है कि ग्लिब्क ने अभी तक आवरण नहीं जोड़ा है)।