मैक ओएस एक्स 10.7 लायन में "तिथि जोड़ी" मेटाडेटा कैसे सेट करें


22

मैक ओएस एक्स 10.7 लायन में फाइंडर फ़ाइल मेटाडाटा का एक नया टुकड़ा दिखाता है, "तिथि जोड़ी गई," जो आइटम को फ़ोल्डर में जोड़े जाने की तारीख को ट्रैक करता है। 10.7 में अपग्रेड करने के बाद, मेरे ~/Downloadsफ़ोल्डर में किसी भी आइटम में "दिनांक जोड़ा गया" मान नहीं है। मैं "तिथि संशोधित" मूल्यों से मेल खाने के लिए सभी खाली "तिथि जोड़ी" मूल्यों को सेट करना चाहता हूं, लेकिन मैं यह नहीं जान सकता कि "तिथि जोड़ा" विशेषता को एक विशिष्ट मूल्य पर कैसे सेट किया जाए।

मेरा पहला अनुमान यह था:

xattr -w com.apple.metadata:kMDItemDateAdded "2012-02-19 16:34:47 +0000" myfile

लेकिन वह काम नहीं करता है (हालांकि यह एक त्रुटि की रिपोर्ट नहीं करता है)।


क्या आप एक समाधान खोजने के लिए समाप्त हो गए?
एरोट्सप्पा

1
स्वीकृत उत्तर ने काम किया जब मैंने इसे आज़माया (जैसा कि यह पागल है)।
जॉन सिराकुसा

जवाबों:


7

ठीक है, यहाँ नया दृष्टिकोण। सावधानी: मेरे पास लायन के लिए एक सिस्टम अपग्रेड नहीं है (मेरा कंप्यूटर लायन इनस्टॉल किया गया है) इसलिए मैं इसका परीक्षण नहीं कर सकता। अयोग्य कोड; इस कोड को आज़माने से पहले बैकअप लें!

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

  1. ऑटोमेटर में एक नया वर्कफ़्लो बनाएं।

  2. "फाइंडर आइटम के लिए पूछें" कार्रवाई जोड़कर फाइंडर से फाइल्स या फोल्डर को स्वीकार करने के लिए वर्कफ़्लो सेट करें।

  3. वर्कफ़्लो "रन AppleScript" कार्रवाई जोड़कर एक AppleScript चलाते हैं।

इस AppleScript का उपयोग करें:

on run {input, parameters}
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges
    tell application "Finder"
        repeat with x in input
            set myfile to POSIX path of x
            set nm to name of x
            set d to modification date of x
            set yr to (character 3 of (year of d as string)) & (character 4 of (year of d as string))
            set mth to (month of d as number) as string
            if length of mth is 1 then set mth to "0" & mth
            set dy to day of d as string
            if length of dy is 1 then set dy to "0" & dy
            set h to hours of d as string
            if length of h is 1 then set h to "0" & h
            set m to minutes of d as string
            if length of m is 1 then set m to "0" & m
            set s to seconds of d as string
            if length of s is 1 then set s to "0" & s
            set dt to mth & ":" & dy & ":" & yr as string
            set tm to h & ":" & m & ":" & s as string
            do shell script "sudo /usr/sbin/systemsetup -setdate '" & dt & "'" with administrator privileges
            do shell script "sudo /usr/sbin/systemsetup -settime '" & tm & "'" with administrator privileges
            do shell script "mv \"" & myfile & "\" /var/tmp/clobber"
            do shell script "mv /var/tmp/clobber \"" & myfile & "\""
        end repeat
    end tell
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime On" with administrator privileges
    return input
end run

उन फ़ाइलों का चयन करें जिनके पास पहले से डेट एडेड नहीं है (फाइंडर में डेट ऐडेड की तरह, फिर बिना डेट ऐड किए लिस्ट का हिस्सा चुनें) और इस सर्विस को चलाएं।

ऑटोमेटर में वर्कफ़्लो का स्क्रीनशॉट


2
यह भयानक है ... एक अच्छे तरीके से, शायद?
जॉन सिराकुसा

1
खैर, यह निश्चित रूप से एक हैक है। लेकिन ऐसा प्रतीत होता है कि मेटाडेटा के विशेष टुकड़े की गणना स्पॉटलाइट से की जाती है, और डार्क रहस्य को हैक किए बिना /.Spotlight-V100, यह उतना ही अच्छा हो सकता है जितना इसे प्राप्त होता है। लेकिन मैं एक साफ जवाब देखना पसंद करूंगा ।
डैनियल

मुझे इस स्क्रिप्ट से एक अजीब त्रुटि हो रही है? sh: -c लाइन 0: अनपेक्षित EOF, जबकि मिलान की तलाश में "
erotsppa

@erotsppa इसे अब ठीक किया जाना चाहिए और अद्यतन किया जाना चाहिए।
डैनियल

AppleScript उस फ़ाइल को संसाधित करते समय एक त्रुटि के साथ बंद हो गया था, $जो उसके नाम पर था, लेकिन मैंने उस फ़ाइल को अस्थायी रूप से नाम बदलकर काम किया। AppleScript इस तरह फ़ाइलों को संभालने बनाने के लिए, अपनी खोजों से संकेत मिलता है कि आप बदल सकते myfileके साथ quoted form of myfileहै, लेकिन मैं परीक्षण नहीं किया है कि। यदि किसी ने कोशिश की है, तो myfileचर को सेट करने और नाम बदलने के समय उद्धृत करना स्पष्ट हो सकता है quotedFilePath
रोरी ओ'केन

7

जब मैं xattr -lअपने डाउनलोड फ़ोल्डर में आइटम पर चलता हूं, तो मुझे एक फ़ील्ड मिलता है जो कुछ इस तरह दिखता है:

com.apple.metadata:kMDItemDownloadedDate:
00000000  62 70 6C 69 73 74 30 30 A1 01 33 41 B4 83 4D BF  |bplist00..3A..M.|
00000010  4C 4F E3 08 0A 00 00 00 00 00 00 01 01 00 00 00  |LO..............|
00000020  00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 13                                   |.....|
00000035

यह एक बाइनरी प्लिस्ट है। जब मैं उन बाइट्स के साथ एक फ़ाइल बनाने के लिए HexFiend का उपयोग करता हूं (हां, मैंने मैन्युअल रूप से उनमें प्रवेश किया था; अतीत से विस्फोट; जैसे कि मेरे Apple में एक पत्रिका से कोडांतरक कोड दर्ज करना] [GS], फिर इसे .plist फ़ाइल के रूप में सहेजें, मैंने खोला। TextWrangler में फ़ाइल और निम्नलिखित असम्पीडित xml मिला:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <date>2011-11-28T05:03:59Z</date>
</array>
</plist>

कहा कि, जबकि Apple संकलित XML में दिनांक संग्रहीत करने के लिए लगता है, सादे पाठ काम करने लगता है।

दूसरे शब्दों में, यदि आप फ़ाइल को संशोधित तिथि स्ट्रिंग रूप में प्राप्त कर सकते हैं, तो आप xattr -w com.apple.metadata:kMDItemDownloadedDate "2012-02-19 16:34:47 +0000" file"डाउनलोड की गई तारीख" को बदलने के लिए कमांड चला सकते हैं , जो ऐसा प्रतीत होता है कि यह क्षेत्र वास्तव में सॉर्ट किया गया है, वास्तविक दिनांक जोड़ा नहीं गया है।

अंत में (अप्रयुक्त) kMDItemDateAddedफ़ील्ड को जोड़ने पर आपको कोई त्रुटि नहीं मिली , क्योंकि जैसा कि मैंने इस लेख में सीखा है , xattrखुशी से आप जो भी मेटाडेटा फ़ील्ड चाहते हैं, उपयोग या अप्रयुक्त सेट करेंगे।

यही उत्तर का मूल है। मैं प्रत्येक फ़ाइल के लिए संशोधित तिथि प्राप्त करने के लिए एक AppleScript लिखने पर काम करूँगा, यह देखने के लिए जांचें कि kMDItemDownloadedDateक्या सेट किया गया है, और यदि यह नहीं है, तो संशोधित तिथि को kMDItemDownloadedDate सेट करें, लेकिन मैं उत्तर का मूल प्राप्त करना चाहता था।


1
अपने डाउनलोड फ़ोल्डर में फ़ाइलों पर mdls चलाएँ और आप kMDItemDateAdded मान देखेंगे। यही कारण है कि खोजक की सूची दृश्य में "तिथि जोड़ी" कॉलम है।
जॉन सिराकुसा

संयोग से, यदि आप kMDItemDownloadedDate को बिना हेक्सिफ़ेंड और टेक्स्टव्रांग्लर के माध्यम से जाने बिना, प्लिस्ट जानकारी के रूप में दिखाना चाहते हैं, तो प्रयास करें xattr -p com.apple.metadata:kMDItemDownloadedDate FILENAME_HERE | xxd -r -p | plutil -convert xml1 - -o -। Xxd बाइनरी प्लिस्ट डेटा में plutilकनवर्ट करता है , फिर XML प्लिस्ट में कनवर्ट करता है और इसे प्रिंट करता है।
मैट गिब्सन

ठीक है, मैं अपने सिर के ऊपर हूं, मुझे कहने से डर लगता है। kMDItemDateAdded में सूचीबद्ध नहीं है xattr -l, और kMDItemDownloadedDate के साथ सूचीबद्ध नहीं है mdls। अजीब तरह से। न तो दिनांक जोड़ा गया फ़ील्ड निर्देशिका के लिए किसी xattr में संग्रहीत है । यह मेटाडेटा कहाँ रहता है?
डैनियल

1
चूँकि xattrएक पायथन लिपि है, मुझे लगता है कि इस लिपि में इधर-उधर टटोलना संभव है और यह पता लगाना चाहिए कि कैसे बाइनरी का गुण बाइनरी डेटा को हेक्स के बजाय प्राप्त करना है, इसलिए आप इसे डायरेक्ट फीड कर सकते हैं plutil
हेराल्ड हैन्च-ऑलसेन

4

मैं खोजक में दिखाए गए "तिथि जोड़ी" को सेट करने का एक तरीका नहीं खोज सकता।

मेरा मानना ​​है कि आप सही हैं कि यह स्पॉटलाइट इंडेक्स के kMDItemDateAddedमेटाडेटा विशेषता से पुनर्प्राप्त है । हालाँकि, स्पॉटलाइट इसे किसी तरह से प्राप्त करता है।

मैंने com.apple.metadata:kMDItemDateAddedकई अलग-अलग स्वरूपों में से एक में एक तिथि मान के लिए एक विस्तारित फ़ाइल विशेषता स्थापित करने की कोशिश की है, जिसमें से उपयोग किए गए प्रारूप सहित kMDItemDateAddedऔर उनमें से कोई भी स्पॉटलाइट इंडेक्स द्वारा उठाया गया था, अर्थात कोई भी मूल्य द्वारा दिखाए गए मूल्य xattr, चाहे जो भी हो द्वारा mdlsनहीं बदला गया था।

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

इसलिए, सारांश में, मुझे लगता है कि जोड़ा गया दिनांक केवल /.Spotlight-V100 की बल्कि गुप्त हिम्मत में कहीं संग्रहीत है, और जब तक कोई व्यक्ति किसी मेटाडेटा प्रविष्टि को एक मनमाने मूल्य पर अद्यतन करने के लिए स्पॉटलाइट को बताने के तरीके के साथ नहीं आ सकता है, मैं 'कर सकता हूं' टी ऐसा करने का एक तरीका देखें।


स्पॉटलाइट! बहुत बढ़िया।
डैनियल

4

समाधान के लिए डैनियल लॉसन को धन्यवाद! यह अभी भी अच्छी तरह से काम करता है, यहां तक ​​कि दो साल बाद भी।

मेरे पास दो जोड़ हैं:

1) कृपया ध्यान दें कि स्वीकृत उत्तर के कोड में एक छोटी सी त्रुटि है।

यह रेखा:

do shell script "/usr/sbin/systemsetup -settime ''" & tm & "'"

... में एक अतिरिक्त एपॉस्ट्रॉफी है, जो एक "अप्रत्याशित ईओएफ" त्रुटि को ट्रिगर करता है। इसे पढ़ना चाहिए:

do shell script "/usr/sbin/systemsetup -settime '" & tm & "'"

2) अधिक महत्वपूर्ण है, Mavericks 10.9.2 के साथ शुरू, systemetup के लिए व्यवस्थापक अधिकारों की आवश्यकता होती है। इसलिए शेल स्क्रिप्ट को हर कॉल इस सूत्र का पालन करना चाहिए:

do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges

यहां AppleScript का पूर्ण संशोधित संस्करण है, 10.9.3 में काम करने की पुष्टि की गई है:

on run {input, parameters}
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges

    tell application "Finder"
        repeat with x in input
            set myfile to POSIX path of x
            set nm to name of x

            set d to modification date of x
            set yr to (character 3 of (year of d as string)) & (character 4 of (year of d as string))
            set mth to (month of d as number) as string
            if length of mth is 1 then set mth to "0" & mth
            set dy to day of d as string
            if length of dy is 1 then set dy to "0" & dy
            set h to hours of d as string
            if length of h is 1 then set h to "0" & h
            set m to minutes of d as string
            if length of m is 1 then set m to "0" & m
            set s to seconds of d as string
            if length of s is 1 then set s to "0" & s

            set dt to mth & ":" & dy & ":" & yr as string
            set tm to h & ":" & m & ":" & s as string
            do shell script "sudo /usr/sbin/systemsetup -setdate '" & dt & "'" with administrator privileges
            do shell script "sudo /usr/sbin/systemsetup -settime '" & tm & "'" with administrator privileges

            do shell script "mv \"" & myfile & "\" /var/tmp/clobber"
            do shell script "mv /var/tmp/clobber \"" & myfile & "\""
        end repeat
    end tell

    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime On" with administrator privileges

    return input
end run

1
अलग पूछने के लिए आपका स्वागत है! किसी और के उत्तर को संपादित करने के लिए उत्तर लिखने के बजाय, उस पोस्ट के नीचे दिए गए उत्तर बटन को संपादित करें या सुधारें , जिसे आप सुधारना चाहते हैं
GRG

इन परिवर्तनों को शामिल करने के लिए डैनियल के उत्तर को संपादित किया गया है
रोरी ओ'केन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.