2013-07-26 5 views
8

यह विभिन्न प्लेटफ़ॉर्म पर गैर-मानक सुविधाओं का क्लासिक केस प्रतीत होता है।सेकेंड में फ़ाइल संशोधित समय प्राप्त करने का सर्वोत्तम तरीका

काफी सरलता से, मैं सेकंड में यूनिक्स टाइमस्टैम्प के रूप में फ़ाइल के संशोधित समय को प्राप्त करने के लिए सार्वभौमिक (या कम से कम व्यापक रूप से समर्थित) विधि चाहता हूं।

अब मुझे stat के साथ ऐसा करने के विभिन्न तरीकों के बारे में पता है लेकिन अधिकांश प्लेटफार्म विशिष्ट हैं; उदाहरण के लिए stat -c %Y $file कुछ के लिए काम करता है, लेकिन ओएस एक्स (और संभवतः अन्य फ्रीबीएसडी सिस्टम) पर काम नहीं करेगा जो इसके बजाय stat -f %m $file का उपयोग करता है।

इसी तरह, कुछ प्लेटफॉर्म का समर्थन date -r $file +%s, हालांकि ओएस एक्स/FreeBSD फिर से नहीं करता है के रूप में -r विकल्प सिर्फ एक यूनिक्स टाइमस्टैम्प के बजाय अन्य प्लेटफार्मों पर के रूप में संदर्भ फ़ाइल विकल्प प्राप्त करने के लिए +%s का उपयोग कर के लिए एक वैकल्पिक हो रहा है।

अन्य विकल्प जो मैं परिचित हूं -printf विकल्प के साथ उपयोग करना है, लेकिन फिर यह व्यापक रूप से समर्थित नहीं है। आखिरी विधि जो मुझे पता है वह ls पार्सिंग है, जो एक अप्रिय चीज करने के अलावा, ऐसा कुछ नहीं है जो मुझे विश्वास है (या कम से कम चाहिए) पर भरोसा किया जा सकता है।

तो, क्या फ़ाइल का संशोधित समय प्राप्त करने के लिए एक और अधिक संगत विधि है? वर्तमान में मैं सिर्फ stat की एक स्क्रिप्ट में अलग-अलग बदलावों को फेंक रहा हूं और शून्य तक की स्थिति से बाहर निकलने तक उन्हें चला रहा हूं, लेकिन यह आदर्श से बहुत दूर है, भले ही मैं भविष्य में पहले चलाने के लिए सफल कमांड को कैश करता हूं।

उत्तर

6

चूंकि ऐसा लगता है कि ऐसा कोई "सही" समाधान नहीं हो सकता है, मुझे लगता है कि मैं तुलना के लिए अपना वर्तमान पोस्ट पोस्ट करूंगा:

if stat -c %Y . >/dev/null 2>&1; then 
    get_modified_time() { stat -c %Y "$1" 2>/dev/null; } 
elif stat -f %m . >/dev/null 2>&1; then 
    get_modified_time() { stat -f %m "$1" 2>/dev/null; } 
elif date -r . +%s >/dev/null 2>&1; then 
    get_modified_time() { stat -r "$1" +%s 2>/dev/null; } 
else 
    echo 'get_modified_time() is unsupported' >&2 
    get_modified_time() { printf '%s' 0; } 
fi 

[संपादित करें] मैं कोड मैं का उपयोग करने की तारीख संस्करण अप करने के लिए और अधिक प्रतिबिंबित करने के लिए इस अद्यतन करने कर रहा हूँ, मूल रूप से यह दो मुख्य stat तरीकों और प्राप्त करने के लिए किसी भी प्रयास में कुछ हद तक एक आम date विधि का परीक्षण करती है वर्तमान कार्यशील निर्देशिका के लिए संशोधित समय, और यदि विधियों में से कोई एक सफल होता है तो यह स्क्रिप्ट में बाद में उपयोग के लिए एक फ़ंक्शन encapsulating बनाता है।

यह विधि पिछले पोस्ट से अलग है क्योंकि यह हमेशा से कुछ प्रसंस्करण करता है, भले ही get_modified_time कभी नहीं कहा जाता है, लेकिन यदि आपको अधिकतर समय कॉल करने की आवश्यकता है तो यह अधिक कुशलता से समग्र है। यह आपको पहले असमर्थित प्लेटफॉर्म को पकड़ने देता है।

आप समारोह है कि केवल कार्यों का परीक्षण करती है जब यह कहा जाता है पसंद करते हैं, तो यहाँ अन्य रूप है:

get_modified_time() { 
    modified_time=$(stat -c %Y "$1" 2> /dev/null) 
    if [ "$?" -ne 0 ]; then 
     modified_time=$(stat -f %m "$1" 2> /dev/null) 
     if [ "$?" -ne 0 ]; then 
      modified_time=$(date -r "$1" +%s 2> /dev/null) 
      [ "$?" -ne 0 ] && modified_time=0 
     fi 
    fi 
    echo "$modified_time" 
} 
0

बस ऑपरेटिंग सिस्टम से इसके नाम के लिए पूछें, और वहां से जाएं। वैकल्पिक रूप से, एक सी प्रोग्राम लिखें, या पाइथन या कुछ और जो सामान्य और अधिक मानकीकृत है: How to get file creation & modification date/times in Python?

+0

मैं वास्तव में कुछ भी बंडल नहीं कर सकते; इसका लक्ष्य सिर्फ एक साधारण शेल स्क्रिप्ट होना है जो लगभग किसी भी यूनिक्स-वाई ओएस पर चलाना चाहिए। समस्या यह है कि मुझे NAS बॉक्स जैसे वातावरण शामिल करने की आवश्यकता है, जिसमें पाइथन या पर्ल शामिल नहीं हो सकते हैं। क्या खोल में ऐसा करने का कोई बेहतर तरीका नहीं है? – Haravikk

संबंधित मुद्दे