2011-12-08 10 views
8

मैं एक रूबी स्क्रिप्ट का उपयोग कर मैक ओएस पर एक फ़ाइल के लिए फाइल सिस्टम निर्माण समय सेट करने की कोशिश कर रहा हूं।मैक ओएस पर रूबी के साथ फ़ाइल निर्माण समय कैसे सेट कर सकता हूं?

मैक ओएस एक्स पर 'ctime' फ़ाइल निर्माण समय के बजाय इनोड संशोधन के अंतिम समय का प्रतिनिधित्व करता है, इस प्रकार ctime सेट करने के लिए ruby's file.utime() का उपयोग करने में मदद नहीं मिलेगी।

Time.parse(`mdls -name kMDItemContentCreationDate -raw "#{filename}"`) 

... लेकिन कैसे गहरे लाल रंग का उपयोग कर इसे स्थापित करने के लिए पर कोई विचार:

इस संकेत [http://inessential.com/2008/12/18/file_creation_date_in_ruby_on_macs] का उपयोग करते हुए मैं एक फ़ाइल के निर्माण के समय प्राप्त कर सकते हैं?

- अद्यतन -

ठीक है, मुझे लगता है कि मैं वास्तव में गहरे लाल रंग का में File.utime के साथ ऐसा कर सकते हैं।

हालांकि ctime तकनीकी रूप से फ़ाइल निर्माण समय को ट्रैक करने के लिए, जब आप utime का उपयोग ctime फाइल सिस्टम जादुई प्रतीत होता है (mtime, जो एक साथ सेट किया जाना चाहिए के साथ) अद्यतन करने के लिए मैक ओएस द्वारा नहीं किया जाता kMDItemContentCreationDate के अनुसार निर्माण समय को भी अपडेट करें।

तो 1st अक्टू 2010 का ctime और 2010 2 एन डी अक्टू के mtime को फ़ाइल नाम स्थापित करने के लिए:

File.utime(Time.strptime('011010', '%d%m%y'), Time.strptime('021010', '%d%m%y'), filename) 
+1

आप अपने 'अपडेट' को समाधान के रूप में समाधान पोस्ट करना चाहते हैं, इसलिए इस प्रश्न को खुले रहने की आवश्यकता नहीं है (और 'अनुत्तरित') – robustus

+0

आप समझते हैं कि यह पोर्टेबल नहीं है। लिनक्स एक निर्माण समय भंडारण का समर्थन नहीं करता है। इसके अलावा ctime निर्माण समय नहीं है, यह निर्देशिका के अनुसार "परिवर्तन" समय है, फ़ाइल के लिए नहीं। यह इसे समझा सकता है: http://stackoverflow.com/a/4009369/128421 –

+1

'utime' का उपयोग कर फ़ाइल समय सेट करना' mdls -name kmDItemContentCreationDate -raw' का उपयोग करके लौटाए गए मान को नहीं बदलेगा। –

उत्तर

11

विधि utime विधि के साथ एक रूबी समाधान है। लेकिन आपको एक बार पर संशोधन समय (एमटाइम) और एक्सेस टाइम (एटिम) सेट करना होगा। आप इस्तेमाल कर सकते हैं आप उपयोग समय रखना चाहते हैं:

File.utime(File.atime(path), modification_time, path) 

Ruby core documentation देखें और साथ ही।

+3

यह निर्माण दिनांक –

+0

अद्यतन नहीं करता है यदि आप उस फ़ाइल पर 'stat -s' चलाते हैं तो आप देखेंगे कि यह 'st_ctime' प्रॉपर्टी को अपडेट नहीं करता है। – fotinakis

3

तो आप निश्चित रूप से एक शुद्ध रूबी समाधान काम कर रहे है, लेकिन बाद से इस ओएस एक्स है , क्या आप exec() या system() का विरोध कर रहे हैं और बस touch का उपयोग कर रहे हैं? आपके मामले में, मैं लगभग पसंद करता हूं:

system "touch -t YYYYMMDDhhmm /what/ever" 

यदि स्पष्टता से कोई अन्य कारण नहीं है।

+0

'टच' उसी तंत्र का उपयोग नहीं करता है जो 'mdls -name kMDItemContentCreationDate -raw' करता है। –

1

यह काम करता है मुझ पर ओएस एक्स 10.11.1 निर्माण समय को अद्यतन करने के लिए:

system "SetFile -d '#{time.strftime "%m/%d/%Y %H:%M:%S"}' #{file}" 

पोर्टेबिलिटी का कोई दावा - SetFile एक ओएस एक्स आदेश है (और आदमी पेज कहना है कि वह XCode 6 के साथ पदावनत है, इसलिए हो सकता है कि बहुत लंबे समय तक काम न करें) - ऐसा करने के लिए कोई और तरीका नहीं मिला, Time.utime ने निर्माण समय अपडेट नहीं किया, लेकिन केवल संशोधित और एक्सेस किया गया समय।

देखें: https://apple.stackexchange.com/q/99536/65787

0

रूबी utimes सिस्टम कॉल का उपयोग करता है फ़ाइल-बार बदलने के लिए।

मानव पेज पढ़ना utimes क्या होता है बताते हैं के लिए:

पूर्णांक utimes (स्थिरांक चार * पथ, स्थिरांक struct timeval * बार); .. यदि समय गैर-नल है, तो यह माना जाता है कि दो समय के संरचनाओं की एक सरणी को इंगित किया जाता है। एक्सेस समय पहले तत्व के मान पर सेट किया गया है, और संशोधन समय दूसरे तत्व के मान पर सेट है। फ़ाइल सिस्टम जो फ़ाइल जन्म (सृजन) समय (जैसे यूएफएस 2) का समर्थन करते हैं, जन्म समय दूसरे तत्व के मान पर सेट किया जाएगा यदि दूसरा तत्व वर्तमान में सेट जन्म समय से पुराना है। जन्म समय और एक संशोधन समय दोनों सेट करने के लिए, दो कॉल की आवश्यकता है; को जन्म देने का पहला और दूसरा (संभवतया नया) संशोधन समय सेट करने वाला पहला। ...

तो सीटा केवल समय में पीछे अपडेट हो जाता है।

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

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