2010-03-18 23 views
8

मैं ls को कई हजार बार कॉल करने के ऊपरी हिस्से से बचने के लिए एक पर्ल स्क्रिप्ट से ls --full-time के आउटपुट को पुन: पेश करना चाहता हूं। मैं stat फ़ंक्शन का उपयोग करने और वहां से सभी जानकारी को पकड़ने की उम्मीद कर रहा था। हालांकि, एलएस आउटपुट में टाइमस्टैंप उच्च-रिज़ॉल्यूशन घड़ी का उपयोग करता है, इसलिए इसमें नैनोसेकंड की संख्या भी शामिल है (जीएनयू दस्तावेज़ों के मुताबिक, यह इसलिए है क्योंकि - पूर्ण समय --format=long --time-style=full-iso के बराबर है, और पूर्ण-आईएसओ समय शैली नैनोसेकंड शामिल हैं)।पर्ल में प्रतीकात्मक लिंक के लिए मैं हाई-रेज माटा कैसे प्राप्त कर सकता हूं?

मैं Time::HiRes मॉड्यूल में आया, जो मानक स्टेट फ़ंक्शन को ओवरराइड करता है जो फ्लोटिंग पॉइंट नंबर के रूप में एटीम/एमटा/सीटाई देता है, लेकिन lstat के लिए कोई ओवरराइड नहीं है। यह एक समस्या है, क्योंकि एक सिम्लिंक पर कॉलिंग स्टेट लिंक की गई फ़ाइल के लिए जानकारी देता है, न कि लिंक के लिए।

तो मेरा सवाल यह है - मुझे lstat का एक संस्करण कहां मिल सकता है जो समय :: HiRes :: stat के समान समय/attime/ctime देता है? यह विफल हो रहा है, उच्च रिज़ॉल्यूशन में एक सिम्लिंक के लिए मोडटाइम प्राप्त करने का एक और तरीका है (एलएस को कॉल करने के अलावा)।

+2

क्या आपको पोर्टेबल समाधान की आवश्यकता है या क्या केवल एक लक्ष्य ऑपरेटिंग सिस्टम है? – mob

उत्तर

3

आपकी सर्वश्रेष्ठ शर्त को Time::HiRes में जोड़ने के लिए पूछना होगा। वास्तव में, आप शायद इसे स्वयं कर सकते हैं। मैं शर्त लगा सकता था तुम सब करने की जरूरत है HiRes.xs में समारोह है कि

void 
stat(...) 

शुरू होता है नकल है कि, बदल stat(...) को lstat(...) & OP_LSTAT को OP_STAT, HiRes.pm में @EXPORT_OK को lstat जोड़ सकते हैं और पुनः संकलित करें। फिर एक पैच सबमिट करें ताकि अन्य लाभ उठा सकें।

+0

OP_LSTAT को OP_STAT बदलना PL_ppaddr [OP_LSTAT] PL_ppaddr [OP_STAT] जैसा ही काम नहीं करेगा क्योंकि Perl_pp_lstat को आंतरिक रूप से Perl_pp_stat द्वारा कार्यान्वित किया गया है ... लेकिन इस तथ्य के लिए +1 कि आपके उत्तर ने मुझे समस्या का समाधान करने का विचार दिया । –

4

आप इनलाइन :: सी उपयोग करने के लिए तैयार हैं, तो इस हाल linux

#!/usr/bin/perl 

use strict; 
use warnings; 

use Inline C => <<'EOC'; 

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

long mtime_nsec(char* fname) 
{ 
    struct stat st; 
    if (-1 == lstat(fname, &st)) 
     return -1; 
    return (long)st.st_mtim.tv_nsec; 
} 
EOC 

print mtime_nsec($ARGV[0]); 
2

निम्न परिवर्तन काम के साथ काम करेंगे। इसमें अनिवार्य रूप से HiRes.pm मॉड्यूल के साथ-साथ xs फ़ाइल दोनों में परिवर्तन शामिल हैं।

HiRes.pm

sub lstat { 
    my @lstatvalues = CORE::lstat(shift); 
    my @nanosecvalues = Time::HiRes::lstatimplementation($lstatvalues[8], $lstatvalues[9], $lstatvalues[10]); 
    ($lstatvalues[8], $lstatvalues[9], $lstatvalues[10]) = ($nanosecvalues[0], $nanosecvalues[1], $nanosecvalues[2]); 
    return @lstatvalues; 
} 

में भी @EXPORT_OK सूची lstat गयी।

HiRes.xs

void 
lstatimplementation(...) 
PPCODE: 
    UV atime = SvUV(ST(0)); 
    UV mtime = SvUV(ST(1)); 
    UV ctime = SvUV(ST(2)); 
    UV atime_nsec; 
    UV mtime_nsec; 
    UV ctime_nsec; 
    hrstatns(atime, mtime, ctime, 
     &atime_nsec, &mtime_nsec, &ctime_nsec); 
    if (atime_nsec) 
    XPUSHs(sv_2mortal(newSVnv(atime + 1e-9 * (NV) atime_nsec))); 
    if (mtime_nsec) 
    XPUSHs(sv_2mortal(newSVnv(mtime + 1e-9 * (NV) mtime_nsec))); 
    if (ctime_nsec) 
    XPUSHs(sv_2mortal(newSVnv(ctime + 1e-9 * (NV) ctime_nsec))); 
+0

क्या आपने [आरटी] (https://rt.cpan.org/Public/Dist/Display.html?Name=Time-HiRes) पर पैच में भेजा है? –

+0

@BradGilbert - अभी तक नहीं। मुझे पूरी तरह से xs फ़ाइल में इस परिवर्तन को पूरा करने का एक और तरीका भी मिला। अभी भी निर्णय लेना बेहतर विकल्प होगा –

1

रिकॉर्ड के लिए में, lstat अगस्त 2013

में समय-काम देता संस्करण 1.9726 में जोड़ा गया है जानकारी के लिए https://rt.cpan.org/Public/Bug/Display.html?id=83356 देखें।

हालांकि, यह अभी भी 1.9725 है जो 2014-01-31 (5.18.2) के अनुसार perl के नवीनतम स्थिर संस्करण में शामिल है। यह 5.1 9.3 में विकास संस्करण में 1.9726 पर पहुंच गया था।

ध्यान दें कि (perl 5.19 के रूप में।8), चाहे Time::HiRes के lstatहै की परवाह किए बिना या नहीं इस्तेमाल किया, पर्ल के -M/-A/-C अभी भी उप-दूसरे के विवरण का स्तर ऐसा नहीं करते हैं (एक ही सेकंड में समय के साथ फ़ाइलों को एक ही उम्र के होने के रूप में दिखाया जाएगा), इसलिए आप अभी भी संशोधन समय के अनुसार फ़ाइलों को सॉर्ट करने के लिए sort {-M $a <=> -M $b} @files जैसी चीजें नहीं कर सकते हैं।