Trova un file specifico con automator

4

La domanda di base è:

How can I pass a filename to the Spotlight search module in Automator?

Il problema essenziale:

Ho centinaia di alias spezzati sparsi in una particolare directory sul mio HD. I file originali ANCORA ANCORA, ma per qualche motivo gli alias hanno perso la connessione. Vorrei sostituirli tutti con collegamenti simbolici, in modo che possano essere sottoposti a backup da Rsync.

Ecco un esempio ridimensionato di una cartella con alias spezzati:

Oraeccounesempiodiunasottodirectorychecontienesiaglioriginalidialcunialiasspezzati,siacopieaggiuntivedell'aliasSAME,chepuntanoancoraadun'altraposizioneperilorooriginali:

E infine, ecco un'immagine di una directory che contiene i file master di alcuni degli alias che si trovavano in entrambe le precedenti 2 posizioni:

Quindiquellochedevofareè:

  1. Identificatuttiglialiasinunadirectorydefinitadall'utente
  2. Utilizzainomifilediqueglialiasperindividuareilorofileoriginali,inunasecondadirectorydefinitadall'utente(inmodoricorsivoeassicurandodinonidentificareunsecondoaliascomeoriginale)
  3. rimuovil'alias
  4. creaunlinksimbolicoalfileoriginale,nellaprecedenteposizionedell'alias

UsoAutomatorovunquesiapossibileeApplescriptovunquesianecessario.Primadellarispostacheharichiestoquestemodifiche,ilmioflussodilavorohaeffettuatoleseguentioperazioni:

  1. Richiedilaposizioneincuicercareifileoriginali
  2. Chiedilaposizionepercercareglialias
  3. OttienipercorsiPOSIXpertuttiglialias
  4. Ottieninomidifileditestodituttiglialias

Ora,sivaunpo'oltre,maconalcuniproblemi:

  1. Avevounaliasintitolato"3dfx & ambience.rfl" (modificato già negli screenshot di "3dfx e ambience.rfl"). Il applescript fornito fallirebbe su quel file a causa della e commerciale.
  2. Dopo aver risolto il problema # 1, lo script è stato eseguito e ha effettivamente rimosso gli alias danneggiati e li ha sostituiti con i collegamenti simbolici. Ma i collegamenti simbolici indicavano la cartella principale che conteneva gli originali, non gli originali stessi. Così ho finito con 2 symlink, "Luftrum 1 - Thor Ambient.rfl" e "Luftrum 2 - Thor Ambient II.rfl", che in realtà indicava la cartella "Luftrum" mostrata nella mia terza schermata sopra.

Speriamo che questo sia abbastanza dettagliato per arrivare finalmente a una soluzione funzionante. Posso dire che è molto vicino.

    
posta Jonathan van Clute 03.09.2013 - 00:36
fonte

3 risposte

2

Se vuoi semplicemente passare un nome di file all'azione Spotlight

Passa il nome del file da un'azione a una variabile set Azione

  • imposta l'azione Spotlight per ignorare l'azione sopra descritta. Fatto facendo clic con il pulsante destro sulla barra del titolo e utilizzando il menu.

  • trascinaerilasciailtokenvariabilenelcampoditestodiricerca.

QUESTO È UN AGGIORNAMENTO

Utilizzo delle azioni di Automator e di Applescript per memorizzare le proprietà per il successivo recupero:

L'idea qui è la prima azione che scrive un file applescript nella cartella dei documenti.

Lo script verrà utilizzato per memorizzare le informazioni che otteniamo lungo il percorso e recuperarle successivamente nell'azione finale di Applescript.

Lo facciamo perché abbiamo bisogno di passare allo script finale più bit di informazione. Che non possiamo fare con le normali variabili in Automator.

Le azioni.

  1. EseguiApplescript:scriviunoscriptdiarchiviazionenellacartelladocumenti

Loscript.

setscript_texttoMakeScript()myRunMaker(script_text)onRunMaker(script_text)setfile_pathto(pathtodocumentsfolderasUnicodetext)&"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, Ask for Finder Items: Questo è per la cartella Alias interrotto.

  • Imposta su Ignora input
  • imposta la partenza su: nella cartella alias danneggiata.
  • imposta il tuo tipo su: cartella

3, Esegui script di applicazione:

  • Scrive il percorso della cartella alias interrotto su una proprietà nel file di script di archiviazione.
  • passa il percorso alla prossima azione

(I write out sono eseguiti da Action Applescript che carica lo script del file di archiviazione, che sarà una versione di sorta, quindi cambierà le proprietà nella sua versione e riscriverà nuovamente il file sostituendo il vecchio)

--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, Ottieni contenuto cartella:

  • L'azione riceve il "percorso della cartella alias interrotto" e ottiene tutti i contenuti della cartella.

5, elementi del filtro di ricerca:

  • Filtra gli elementi in modo che contengano solo file alias.

Tutti: Tipo: è: altro: alias

  • Passa l'elenco alla prossima azione

6, Esegui script di applicazione:

Scrive PATH alias spezzato su una proprietà nel file di script di archiviazione.

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, Chiedi elementi del Finder: Questo è per la cartella dei file originali.

  • Imposta su Ignora input
  • imposta l'inizio su: nella cartella dei file originali.
  • imposta il tuo tipo su: cartella

8, Run Applescript:

Scrive la cartella dei file originali in una proprietà nel file di script di archiviazione.

 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, Run Applescript:

Questo recupera le informazioni dallo script di archiviazione. Questo richiederà l'elenco dei percorsi dei file alias morti.

  • Prova e trova un file corrispondente nella cartella dei file originali. Osserverà tutte le corrispondenze ma ignorerà gli alias.

  • Rimuovi il vecchio file Alias (controllando che sia prima un file alias)

  • Crea un link simbolico nella cartella in cui si trovava il vecchio alias dal file di corrispondenza trovato.

  • Solo i file alias dovrebbero essere cancellati. Se non viene trovato alcun file corrispondente, il file alias non verrà eliminato. Né verrà creato un collegamento simbolico.

.

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

Prova prima .. usa a tuo rischio e tutto il resto ..

    
risposta data 08.09.2013 - 14:39
fonte
2

Solitamente "alias spezzato" si riferisce ad un alias in cui il file originale non esiste più. Ho usato questo script per trovare alias del genere:

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

Se lo script trova gli alias che si desidera sostituire i collegamenti simbolici, salva le righe pertinenti dell'output in un file di testo. Quindi prova a eseguire uno script di shell come questo:

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
    
risposta data 03.09.2013 - 10:47
fonte
0

Potresti usare mdfind che è la versione da riga di comando di Spotlight in un indice di shell in Automator. È possibile passare variabili da e verso questo script / comando tramite stdin e stdout.

EDIT se non vuoi provare a utilizzare i comandi della shell:

Hai provato a impostare un valore di una variabile in Automator, quindi fai clic con il pulsante destro del mouse sulla casella di input Spotlight e scegli "Nuova variabile ..." dalla parte inferiore dell'elenco a comparsa?

    
risposta data 07.09.2013 - 18:13
fonte

Leggi altre domande sui tag