स्वचालित के साथ एक विशिष्ट फ़ाइल ढूंढें


4

मूल प्रश्न है:

मैं ऑटोमेटर में स्पॉटलाइट सर्च मॉड्यूल में फ़ाइल नाम कैसे दे सकता हूं?

आवश्यक समस्या:

मेरे पास एक विशेष निर्देशिका में बिखरे हुए सैकड़ों एलियाज़ हैं जो मेरे एचडी पर हैं। मूल फ़ाइलें अभी भी मौजूद हैं, लेकिन किसी कारण से उपनामों ने अपना कनेक्शन खो दिया है। मैं उन सभी को सिम्बलिंक के साथ बदलना चाहूंगा, ताकि उन्हें रुपीस द्वारा बैकअप दिया जा सके।

यहाँ एक फ़ोल्डर का स्केल-डाउन उदाहरण है जिसमें टूटी हुई एलियास

enter image description here

अब यहाँ एक उप-निर्देशिका का एक उदाहरण दिया गया है जिसमें कुछ टूटे हुए उपनामों के दोनों मूल हैं, साथ ही एसएएमई उर्फ ​​की अतिरिक्त प्रतियां भी हैं, जो अभी भी अपने मूल के लिए किसी अन्य स्थान को इंगित करते हैं:

enter image description here

और अंत में, यहां एक निर्देशिका की एक छवि है जिसमें कुछ उपनामों के लिए मास्टर फाइलें हैं जो पिछले 2 वर्षों में दोनों में स्थित थीं:

enter image description here

तो मुझे क्या करने की आवश्यकता है:

  1. उपयोगकर्ता-परिभाषित निर्देशिका में सभी उपनामों को पहचानें
  2. अपनी मूल फ़ाइलों का पता लगाने के लिए उन उपनामों के फाइलनेम का उपयोग करें, एक दूसरे उपयोगकर्ता-परिभाषित निर्देशिका में (पुनरावर्ती और मूल रूप में एक दूसरे उपनाम की पहचान नहीं करने के लिए सुनिश्चित करें)
  3. उर्फ को हटा दें
  4. उपनाम के पूर्व स्थान में, मूल फ़ाइल के लिए एक सिमलिंक बनाएं

मैं जहाँ भी मैं कर सकता हूँ, और जहाँ भी मुझे चाहिए, मैं स्वचालक का उपयोग कर रहा हूँ प्रतिक्रिया से पहले, जिसने इन संपादन को प्रेरित किया, मेरे वर्कफ़्लो ने निम्नलिखित कार्य किया:

  1. मूल फ़ाइलों के लिए देखने के लिए स्थान के लिए संकेत दें
  2. उपनाम के लिए स्थान के लिए शीघ्र
  3. सभी उपनामों के लिए POSIX पथ प्राप्त करें
  4. सभी उपनामों का पाठ फ़ाइल नाम प्राप्त करें

अब, यह थोड़ा और आगे बढ़ता है लेकिन कुछ समस्याओं के साथ:

  1. मेरा एक उपनाम था "3dfx & amp; ambience.rfl" (स्क्रीनशॉट में पहले से ही बदलकर "3dfx और ambience.rfl")। प्रदान की गई एप्लेसस्क्रिप्ट एम्परसैंड के कारण उस फ़ाइल पर विफल हो जाएगी।
  2. # 1 को ठीक करने के बाद, स्क्रिप्ट चली और वास्तव में टूटी हुई एलियाज़ को हटा दिया और उन्हें सिम्बलिंक्स के साथ बदल दिया। लेकिन सहानुभूति मूल माता-पिता को इंगित करती है जिसमें मूल होते थे, न कि मूल। इसलिए मैंने 2 सिमिलिंक, "लुफ्ट्रम 1 - थोर एम्बिएंट.रफ्ल" और "लुफ्ट्रम 2 - थोर एंबिएंट II.rfl" को समाप्त किया, जो कि वास्तव में ऊपर मेरे तीसरे स्क्रीनशॉट में दिखाए गए "लुफ्ट्रम" फ़ोल्डर को इंगित करता है।

उम्मीद है कि यह अंत में एक कार्य समाधान पर पहुंचने के लिए पर्याप्त होगा मैं बता सकता हूं कि यह बहुत करीब है।


मैं अपने उत्तर को संपादित करने के लिए स्पॉटलाइट के साथ खेल रहा हूं, और इस पर कुछ विचार हैं ... यदि आपको ऑटोमेकर के माध्यम से काम करने वाले स्पॉटलाइट मिलते हैं, तो आपको कैसे पता चलेगा कि परिणाम मृत उपनाम या किसी अन्य फ़ाइल में समान नाम से नहीं है ? आपके द्वारा वर्णित टूल के लिए यह बहुत अच्छा होगा, लेकिन इसे इस तरीके से लागू करना जोखिम भरा लगता है। शेल या अजगर सीखने के लिए अच्छी प्रेरणा हो सकती है!
beroe

मैंने आपके लिए एक उत्तर छोड़ा है। जो स्क्रिप्ट काम करती है। लेकिन हमारे लिए यह आसान होगा कि आप सूची को वास्तविक रूप से एक क्रिया में प्रदर्शित करें यदि आप हमें दिखाते हैं कि आपकी सूचियाँ कैसे बनाई / स्वरूपित हैं और आप वास्तव में उन्हें कैसे प्राप्त कर रहे हैं। यानी अंतिम परिणाम और आप वहां कैसे पहुंचे
markhunte

@beroe - यह केवल एक फ़ोल्डर की सामग्री को फ़िल्टर करने के लिए ऑटोमोटिव में बहुत आसान है, केवल उपनामों के नीचे। markhunte - आपकी प्रतिक्रिया की बहुत सराहना! मुझे उम्मीद है कि मेरा संपादित प्रश्न अब आपको यह देखने में मदद करेगा कि मैं क्या करने की कोशिश कर रहा हूं।
Jonathan van Clute

नमस्ते मेरे पास उत्तर अपडेट है।
markhunte

जवाबों:


2

यदि आप बस स्पॉटलाइट एक्शन के लिए एक फ़ाइल नाम देना चाहते हैं

फ़ाइल का नाम एक्शन से पास करने के लिए a चर सेट करें कार्य

  • उपरोक्त कार्रवाई को अनदेखा करने के लिए स्पॉटलाइट एक्शन सेट करें। यह शीर्षक पट्टी पर राइट क्लिक करके और मेनू का उपयोग करके किया।

enter image description here

  • खोज पाठ फ़ील्ड में चर टोकन को खींचें और छोड़ें।

enter image description here


यह एक अद्यतन है

बाद की पुनर्प्राप्ति के लिए गुणों को संग्रहीत करने के लिए ऑटोमेकर क्रियाओं और एप्सस्क्रिप्ट का उपयोग करना

यह विचार यहाँ पहली कार्रवाई है जो दस्तावेज़ फ़ोल्डर में एक एप्सस्क्रिप्ट फाइल लिखता है।

स्क्रिप्ट का उपयोग हमारे द्वारा प्राप्त की जाने वाली जानकारी को संग्रहीत करने के लिए किया जाएगा और फिर बाद में इसे अंतिम Applescript कार्रवाई में पुनः प्राप्त किया जाएगा।

हम ऐसा इसलिए करते हैं क्योंकि हमें अंतिम स्क्रिप्ट को कई बिट्स सूचनाओं को पारित करने की आवश्यकता होती है। जो हम ऑटोमेटर में सामान्य चर के साथ नहीं कर सकते हैं।

क्रियाएँ।

enter image description here

  1. रन अप्पस्क्रिप्ट: दस्तावेज़ फ़ोल्डर में एक भंडारण स्क्रिप्ट लिखें

लिपी।

set script_text to MakeScript()
my RunMaker(script_text)

on RunMaker(script_text)
    set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt"
    set file_path to POSIX path of file_path as string
    store script script_text in file_path with replacing
end RunMaker


on MakeScript()

    script
        property theBrokenAliasFolderPath : ""
        property broken_alias_file_Paths : {}

        property theOriginalFolderPath : ""
        property Original_file_Paths : {}


        property SearchfileNames : {}

    end script
end MakeScript

2, फाइंडर आइटम के लिए पूछें: यह टूटे हुए उपनाम के फ़ोल्डर के लिए है।

  • इनपुट को इग्नोर करने के लिए सेट करें
  • अपने प्रारंभ को अपने टूटे हुए अन्य उपनाम फ़ोल्डर में सेट करें।
  • अपना प्रकार सेट करें: फ़ोल्डर

3, रन एपलस्क्रिप्ट:

  • भंडारण स्क्रिप्ट फ़ाइल में किसी संपत्ति के टूटे हुए उपनाम फ़ोल्डर पथ को लिखता है।
  • अगली कार्रवाई के लिए पथ पर जाएं

(लेखन बहिष्कार स्टोरेज फ़ाइल स्क्रिप्ट लोड करने वाली एक्शन एपस्क्रिप्ट द्वारा किया जाता है। यह एक प्रकार का संस्करण होगा। यह इसके संस्करण में गुणों को बदल देगा और पुराने के स्थान पर फिर से फाइल को फिर से लिखना होगा)

--WRITE OUT BROKEN ALIAS FOLDER PATH


on run {input, parameters}

    set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt" as alias

    set script_text to load script file_path

    set theBrokenAliasFolderPath of script_text to (POSIX path of (item 1 of input))


    my RunMaker(script_text)

    return input
end run



on RunMaker(script_text)
    set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt"
    set file_path to POSIX path of file_path as string
    store script script_text in file_path with replacing
end RunMaker

4, फ़ोल्डर सामग्री प्राप्त करें:

  • कार्रवाई "टूटी हुई उर्फ ​​फ़ोल्डर पथ" प्राप्त करती है और फ़ोल्डर की सभी सामग्री प्राप्त करती है।

5, फ़िल्टर खोजक आइटम:

  • आइटमों को फ़िल्टर करें, ताकि उनमें केवल उर्फ ​​फाइलें हों।

सभी: प्रकार: अन्य: उपनाम है

  • अगली कार्रवाई के लिए सूची को पास करें

6, रन एपलस्क्रिप्ट:

भंडारण स्क्रिप्ट फ़ाइल में एक संपत्ति के टूटे हुए उर्फ ​​PATHS लिखता है।

on run {input, parameters}

    set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt" as alias

    set script_text to load script file_path

    set broken_alias_file_Paths of script_text to input


    my RunMaker(script_text)

    return input
end run
on RunMaker(script_text)
    set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt"
    set file_path to POSIX path of file_path as string
    store script script_text in file_path with replacing
end RunMaker

7, फाइंडर आइटम के लिए पूछें: यह ऑरिजनल फाइल फोल्डर के लिए है।

  • इनपुट को इग्नोर करने के लिए सेट करें
  • अपनी शुरुआत को अपने मूल फ़ाइल फ़ोल्डर में सेट करें।
  • अपना प्रकार सेट करें: फ़ोल्डर

8, रन एप्सस्क्रिप्ट:

भंडारण स्क्रिप्ट फ़ाइल में एक संपत्ति के लिए मूल फ़ाइलें फ़ोल्डर लिखता है।

 on run {input, parameters}

        set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt" as alias

        set script_text to load script file_path

        set theOriginalFolderPath of script_text to (POSIX path of (item 1 of input))


        my RunMaker(script_text)

        return input
    end run



    on RunMaker(script_text)
        set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt"
        set file_path to POSIX path of file_path as string
        store script script_text in file_path with replacing
    end RunMaker

9, रन एपलस्क्रिप्ट:

यह संग्रहण स्क्रिप्ट से जानकारी पुनर्प्राप्त करता है। यह मृत उर्फ ​​फाइलों के रास्तों की सूची लेगा।

  • मूल फ़ाइल फ़ोल्डर में एक मिलान फ़ाइल आज़माएं और ढूंढें। यह सभी मैचों को देखेगा लेकिन उपनामों को नजरअंदाज करेगा।

  • पुरानी एलियास फाइल को हटा दें (पहले यह उर्फ ​​फाइल की जांच कर रहा है)

  • फ़ोल्डर में एक सिमिलिंक बनाएं जो पुराना उपनाम मिला मिलान वाली फ़ाइल से था।

  • केवल अन्य फ़ाइलों को हटा दिया जाना चाहिए। यदि कोई मिलान फ़ाइल नहीं मिली है, तो अन्य फ़ाइल नहीं हटाई जाएगी। और न ही कोई सिमिलिंक बनाया जाएगा।

set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt" as alias

            set theScript to load script file_path


            --choose a search folder
            set searchPath to quoted form of theOriginalFolderPath of theScript
            set folderPath to quoted form of theBrokenAliasFolderPath of theScript
            set input to broken_alias_file_Paths of theScript


            repeat with i from 1 to count of items of input

                set this_item to item i of input

                set aliasPath to this_item

                #Get the the file name
                set theFileName to "\\\"" & (do shell script "basename " & quoted form of (POSIX path of (this_item))) & "\\\"" as string
                log theFileName

                #search the searchPath for a matching file with the same name.
                #NOTE: this will find all files with he same name. So We use last paragraph to get what should be the first one it finds.
                set theOrigFilePath to paragraphs of (do shell script "mdfind -onlyin " & searchPath & " kMDItemFSName == \"" & theFileName & "\"")


                if theOrigFilePath is not quoted form of "" then

                    repeat with i from 1 to count of items in theOrigFilePath

                        set this_item to item i of theOrigFilePath
                        log this_item
                        tell application "Finder"

                            #make sure we are pointing to an alais that will be deleted and not another symlink file. Otherwise the original file will be deleted.

                            set theKind to kind of ((POSIX file this_item) as alias)

                            if theKind is not equal to "Alias" then
                                set this_item to quoted form of (item i of theOrigFilePath)
                                my symLink(aliasPath, this_item)
                            end if


                        end tell


                    end repeat



                end if

            end repeat


            on symLink(aliasPath, aOrigFilePath)

                #move to trash the old alias file

                set theOldAlias to aliasPath
                tell application "Finder"

                    #make sure we are pointing to an alais that will be deleted and not another symlink file. Otherwise the original file will be deleted.

                    set theKind to kind of theOldAlias
                    set theNewFilePath to (POSIX path of (aliasPath)) as string
                    if theKind is equal to "Alias" then
                        delete theOldAlias

                        log "ln -s  " & aOrigFilePath & space & (quoted form of theNewFilePath)
                        #create the symlink
                        do shell script "ln -s  " & aOrigFilePath & space & (quoted form of theNewFilePath)
                    end if
                end tell
            end symLink

पहले परीक्षण करें .. अपने जोखिम पर उपयोग करें और यह सब ..


पवित्र शियाटू! यह वही लगता है जो मुझे चाहिए। मैं इसे ASAP का परीक्षण करूंगा! मुझे नहीं पता था कि आप इसे खींच सकते हैं & amp; एक चर की तरह है कि ड्रॉप - बहुत अच्छा! दुर्भाग्य से मेरा मानना ​​है कि यह केवल एकल मूल्यों के लिए काम करेगा, सूचियों के लिए नहीं। लेकिन आपकी अपील उत्तर की तरह लगती है। यह अभी भी कुछ शेल स्क्रिप्टिंग का उपयोग करता है जिसे मैं बचने की उम्मीद कर रहा था, लेकिन मैंने स्वीकार किया है कि शायद कोई दूसरा रास्ता नहीं है। धन्यवाद, आपको बताएंगे कि क्या यह मेरे लिए समस्या को हल करता है!
Jonathan van Clute

नजदीक पर बिना सिगार के। यह 2 टूटे हुए उपनामों को कूड़ेदान में ले गया, लेकिन दोनों के मूल "लुफ्ट्रम" नामक एक फ़ोल्डर के अंदर स्थित थे। स्क्रिप्ट ने उस फ़ोल्डर के 2 सिम्लिंक बनाए, प्रत्येक का नाम बदलकर मृत एलियंस के नाम पर रख दिया, और उन्हें सही जगह पर रख दिया। इसलिए अब मेरे पास एक फ़ोल्डर में 2 अलग-अलग नाम हैं, लेकिन अन्यथा समान उपनाम हैं, जिसमें केवल वास्तविक मृत उपनाम वस्तुओं के अलावा अन्य आइटम हैं। मैं इस समस्या का निवारण स्वयं करने की कोशिश करूँगा, लेकिन आप इसे और अधिक तेज़ी से करने में सक्षम हो सकते हैं और यदि आप अपना उत्तर संपादित कर सकते हैं, तो मैं इसकी सराहना करूँगा!
Jonathan van Clute

अतिरिक्त अवलोकन, यह उन फ़ाइलनामों पर मर जाता है जिनमें एम्परसेंड होते हैं। ऐसा लगता है कि उन्हें भागने की जरूरत है, लेकिन मैं सिंटेक्स के बारे में सुनिश्चित नहीं हूं कि वह पूरा करें।
Jonathan van Clute

उह ओह ... एक और गंभीर मुद्दा यह है कि मेरे पास कुछ मामलों में कई उपनाम हैं। तो स्क्रिप्ट मान रही है कि पहला मिलान नाम मिला, मूल है जब यह नहीं हो सकता है। यह देखने के लिए भी जांच करनी चाहिए कि यह एक उपनाम नहीं है। मैं स्वयं इसे आज़माने जा रहा हूं, लेकिन यदि मैं विफल रहता हूं, तो यह आश्चर्यजनक होगा कि आप इस समायोजन को भी कर सकते हैं =)
Jonathan van Clute

नमस्ते। जब मैं परीक्षण चलाता हूं तो मुझे आपके पहले दो मुद्दे नहीं मिलते हैं। पहला मुद्दा अगर मैं आपको सही ढंग से समझ रहा हूं कि स्क्रिप्ट मूल फ़ाइलों को ढूंढ रही है लेकिन फ़ाइल नाम सिम्लिंक कोड को पारित नहीं किया जा रहा है। इसके अलावा एक i.e पर एक फ़ोल्डर का परीक्षण किया गया है, जिसका नाम "मेरे साथ एक फ़ोल्डर; हां" है। जब यह फ़ाइलों और फ़ोल्डरों के लिए आता है तो एप्सस्क्रिप्ट में कुछ भाषाओं और उनके पाठ एन्कोडिंग के साथ समस्या हो सकती है। मुझे संदेह है कि यह मामला है। लेकिन आपको वास्तव में एक उदाहरण दिखाने की आवश्यकता है कि आपके उपनाम और फाइलें कैसे व्यवस्थित हैं और आपकी सूची कैसे संरचित है। और हमें अपने शब्द विवरण से काम करने से बचाएं ।।
markhunte

2

आमतौर पर "टूटा हुआ उपनाम" एक उपनाम को संदर्भित करता है जहां मूल फ़ाइल अब मौजूद नहीं है। मैंने इस स्क्रिप्ट का उपयोग उपनामों को खोजने के लिए किया है:

set l to {}
tell application "Finder"
    try
        alias files of entire contents of (POSIX file "/Users/username" as alias)
        result as list
    on error
        return
    end try
    repeat with f in result
        try
            original item of contents of f
        on error
            --move contents of f to trash
            set end of l to POSIX path of (f as text)
        end try
    end repeat
end tell
set text item delimiters to linefeed
l as text

यदि स्क्रिप्ट उन एलियास को खोजती है जिन्हें आप सीलिंक को बदलना चाहते हैं, तो आउटपुट की संबंधित लाइनों को टेक्स्ट फ़ाइल में सहेजें। फिर इस तरह एक शेल स्क्रिप्ट चलाने की कोशिश करें:

cat /tmp/aliases.txt | while IFS= read -r f; do
  original=$(find ~/directory/with/original/files -name "${f##*/}" | head -n1)
  echo "$f:$original"
  # rm "$f"; ln -s "$original" "$f"
done

दुर्भाग्य से (?), मेरे मामले में ऐसा नहीं है। मूल फाइलें मौजूद नहीं हैं। मुझे नहीं पता कि उपनाम क्यों टूट गया। गेट इंफो को देखते हुए, मुझे लगता है कि वे सभी मूल के रूप में थीम की ओर इशारा करते हैं। आपके कोड में भी (और मैं AppleScripter में से बहुत ज्यादा नहीं हूं इसलिए मुझे माफ कर दो), यह एक पूरी निर्देशिका में सब कुछ का एक उपनाम बनाकर शुरू होता है। ऐसा क्यों है? मैं स्पष्ट नहीं हूं कि मदद के लिए क्या करेंगे। मैं वर्तमान में सभी उपनामों के माध्यम से एक धीरज में पुनरावृत्ति करता हूं और मूल सामग्री प्राप्त करने का प्रयास करता हूं और यदि यह विफल हो जाता है, तो मुझे पता है कि मेरे पास टूटी हुई हड़िया है। इसलिए उन्हें ढूंढना आसान है, यह उनकी मूल फ़ाइल ढूंढ रहा है जिसे मैं अटका रहा हूं।
Jonathan van Clute

alias files of entire contents of (POSIX file "/Users/username" as alias) बस के तहत सभी उर्फ ​​फ़ाइलों की एक सूची हो जाता है /Users/username। आप कुछ के साथ संसाधन कांटे से मूल पथ निकालने की कोशिश कर सकते हैं cat example.txt\ alias/..namedfork/rsrc | strings
Lri

मेरे पास पहले से ही सभी उर्फ ​​फाइलें हैं, और उनके सभी रास्ते हैं। ऑटोमेकर ने मुझे वह आसानी से दे दिया, यह समस्या नहीं है। समस्या यह है कि मैं अपने ड्राइव पर कहीं और मूल फ़ाइलों का पता लगाने के लिए, फ़ाइल नाम पर खोज नहीं कर सकता। वे मौजूद हैं, और एक विशिष्ट निर्देशिका के नीचे कहीं स्थित हैं, लेकिन सैकड़ों अन्य उपनिर्देशिकाओं में से किसी में भी हो सकते हैं।
Jonathan van Clute

0

आप उपयोग कर सकते हैं mdfind जो ऑटोमेटर में शेल सबस्क्रिप्ट में स्पॉटलाइट का कमांड-लाइन संस्करण है। आप इस स्क्रिप्ट / कमांड से चर को stdin और stdout से पास कर सकते हैं।

संपादित करें यदि आप किसी शेल कमांड का उपयोग करना नहीं चाहते हैं:

क्या आपने ऑटोमेटर में एक चर के मान को स्थापित करने की कोशिश की, फिर स्पॉटलाइट इनपुट बॉक्स पर राइट-क्लिक करें और पॉप-अप सूची के नीचे से "नई चर ..." चुनें?

spotlight screenshot...


धन्यवाद, लेकिन बहुत अधिक विस्तार के बिना, यह मेरे सिर पर है। मैं वास्तव में शेल स्क्रिप्टिंग के लिए ऑटोमेटर के बाहर छोड़ने से बचने के लिए देख रहा हूं। ज़्यादातर मैं बुनियादी एप्सस्क्रिप्ट के साथ रहना पसंद करूंगा, लेकिन यह भी एक अंतिम उपाय होगा। मैं सिर्फ स्पॉटलाइट मॉड्यूल के इनपुट के रूप में एक चर पास करना चाहता हूं।
Jonathan van Clute

मैंने केवल इस टिप्पणी को संपादित करने पर ध्यान दिया। मैं इस तरह से एक चर का उपयोग नहीं कर सकता क्योंकि इनपुट वस्तुओं की एक सूची है, और ऑटोमेटर उपरोक्त फैशन में सूचियों को नहीं संभालता है। आपको AppleScript या शेल स्क्रिप्टिंग का सहारा लेना होगा। = (
Jonathan van Clute
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.