Finden Sie eine bestimmte Datei mit Automator

Die Grundfrage lautet:

Wie kann ich einen Dateinamen an das Spotlight-Suchmodul in Automator übergeben?

Das wesentliche Problem:

Ich habe Hunderte defekter Aliase, die über ein bestimmtes Verzeichnis auf meiner Festplatte verstreut sind. Die Originaldateien EXISTIEREN NOCH, aber aus irgendeinem Grund haben die Aliase ihre Verbindung verloren. Ich möchte sie alle durch Symlinks ersetzen, damit sie von Rsync gesichert werden können.

Hier ist ein verkleinertes Beispiel eines Ordners mit fehlerhaften Aliasen darin:

Geben Sie hier die Bildbeschreibung ein

Hier ist nun ein Beispiel für ein Unterverzeichnis, das sowohl die Originale einiger der defekten Aliase als auch zusätzliche Kopien des SAME-Alias ​​enthält, die immer noch auf einen anderen Speicherort für ihre Originale verweisen:

Geben Sie hier die Bildbeschreibung ein

Und schließlich ist hier ein Bild eines Verzeichnisses, das die Masterdateien einiger der Aliase enthält, die sich an den beiden vorherigen 2-Standorten befanden:

Geben Sie hier die Bildbeschreibung ein

Was ich also tun muss, ist:

  1. Identifizieren Sie alle Aliase in einem benutzerdefinierten Verzeichnis
  2. Verwenden Sie die Dateinamen dieser Aliase, um ihre Originaldateien in einem zweiten benutzerdefinierten Verzeichnis zu finden (rekursiv und um sicherzustellen, dass ein zweiter Alias ​​nicht als Original identifiziert wird).
  3. entfernen Sie den Alias
  4. Erstellen Sie einen Symlink zur Originaldatei am früheren Speicherort des Alias

Ich benutze Automator, wo immer ich kann, und Applescript, wo immer ich muss. Vor der Antwort, die diese Änderungen veranlasste, führte mein Workflow Folgendes aus:

  1. Fordern Sie den Speicherort an, um nach Originaldateien zu suchen
  2. Zur Eingabe des Standorts auffordern, um nach Aliasnamen zu suchen
  3. Holen Sie sich POSIX-Pfade zu allen Aliasen
  4. Holen Sie sich Textdateinamen aller Aliase

Jetzt geht es etwas weiter, aber mit einigen Problemen:

  1. Ich hatte einen Alias ​​namens "3dfx & ambient.rfl" (bereits in den Screenshots in "3dfx and ambient.rfl" geändert). Das bereitgestellte Applescript würde bei dieser Datei aufgrund des kaufmännischen Und fehlschlagen.
  2. Nach der Behebung von Nr. 1 lief das Skript und entfernte tatsächlich defekte Aliase und ersetzte sie durch Symlinks. Aber die symbolischen Links verwiesen auf den übergeordneten Ordner, der die Originale enthielt, nicht auf die Originale selbst. So landete ich bei 2 Symlinks, "Luftrum 1 - Thor Ambient.rfl" und "Luftrum 2 - Thor Ambient II.rfl", die in Wirklichkeit auf den Ordner "Luftrum" zeigten, der in meinem dritten Screenshot oben gezeigt wurde.

Hoffentlich reichen diese Details aus, um letztendlich zu einer funktionierenden Lösung zu gelangen. Ich kann sagen, es ist sehr nah.

Ich habe mit Spotlight gespielt, um meine Antwort zu bearbeiten, und habe einige Gedanken dazu ... Wenn Sie Spotlight über Automator zum Laufen bringen, woher wissen Sie, dass das Ergebnis nicht der tote Alias ​​​​oder eine andere Datei mit demselben einfachen Namen ist? ? Es wäre großartig, das von Ihnen beschriebene Tool zu haben, aber es scheint riskant, es auf diese Weise zu implementieren. Kann eine gute Motivation sein, Shell oder Python zu lernen!
Ich habe eine Antwort für Sie hinterlassen. Was das Skript funktioniert. Aber es wäre einfacher für uns, Ihnen die tatsächliche Übergabe der Liste in eine Aktion zu zeigen, wenn Sie uns zeigen, wie Ihre Listen gebildet/formatiert werden. Und wie Sie sie tatsächlich bekommen. dh das Endergebnis und wie Sie dorthin gekommen sind
@beroe - Im Automator ist es ziemlich einfach, den Inhalt eines Ordners zuerst nur auf Aliase zu filtern. markhunte - Vielen Dank für Ihre Antwort! Ich hoffe, meine bearbeitete Frage hilft Ihnen jetzt zu sehen, was ich versuche zu tun.
Hallo, ich habe die Antwort aktualisiert.

Antworten (3)

Wenn Sie einfach einen Dateinamen an die Spotlight-Aktion übergeben möchten

Der Dateiname wird von einer Aktion an eine Set-Variable Action übergeben

  • Stellen Sie die Spotlight-Aktion so ein, dass die oben genannten Aktionen ignoriert werden. Erledigt, indem Sie mit der rechten Maustaste auf die Titelleiste klicken und das Menü verwenden.

Geben Sie hier die Bildbeschreibung ein

  • Ziehen Sie das Variablen-Token in das Suchtextfeld und legen Sie es dort ab.

Geben Sie hier die Bildbeschreibung ein


DIES IST EINE AKTUALISIERUNG

Verwenden von Automator-Aktionen und Applescript zum Speichern von Eigenschaften für den späteren Abruf:

Die Idee hier ist, dass die erste Aktion eine Applescript-Datei in den Dokumentenordner schreibt.

Das Skript wird verwendet, um Informationen zu speichern, die wir unterwegs erhalten, und sie später in der letzten Applescript-Aktion abzurufen.

Wir tun dies, weil wir dem endgültigen Skript mehrere Informationsbits übergeben müssen. Was wir mit den normalen Variablen in Automator nicht tun können.

Die Taten.

Geben Sie hier die Bildbeschreibung ein

  1. Führen Sie Applescript aus: Schreiben Sie ein Speicherskript in den Dokumentenordner

Das Drehbuch.

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, Fragen Sie nach Finder-Objekten: Dies ist für den Ordner „Broken Alias“.

  • Auf Eingabe ignorieren setzen
  • Setzen Sie Ihren Start auf: in Ihrem defekten Alias-Ordner.
  • Stellen Sie Ihren Typ auf: Ordner

3, Führen Sie Applescript aus:

  • Schreibt den fehlerhaften Aliasordnerpfad in eine Eigenschaft in der Speicherskriptdatei.
  • Übergeben Sie den Pfad an die nächste Aktion

(Das Ausschreiben erfolgt durch das Action Applescript, das das Skript für die Speicherdatei lädt. Dies wird eine Art Version sein. Es wird dann die Eigenschaften in seiner Version ändern und die Datei erneut ausschreiben und die alte ersetzen.)

--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, Ordnerinhalt abrufen:

  • Die Aktion erhält den "unterbrochenen Alias-Ordnerpfad" und ruft den gesamten Inhalt des Ordners ab.

5, Finder-Elemente filtern:

  • Filtern Sie die Elemente so, dass sie nur Aliasdateien enthalten.

Alle: Art : ist : andere : Alias

  • Übergeben Sie die Liste an die nächste Aktion

6, Applescript ausführen:

Schreibt defekte Aliaspfade in eine Eigenschaft in der Speicherskriptdatei.

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, Fragen Sie nach Finder-Objekten: Dies ist für den Originaldateiordner.

  • Auf Eingabe ignorieren setzen
  • Setzen Sie Ihren Start auf: in Ihrem Originaldateiordner.
  • Stellen Sie Ihren Typ auf: Ordner

8, Führen Sie Applescript aus:

Schreibt den Originaldateiordner in eine Eigenschaft in der Speicherskriptdatei.

 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, Applescript ausführen:

Dadurch werden die Informationen aus dem Speicherskript abgerufen. Dadurch wird die Liste der Pfade der toten Alias-Dateien übernommen.

  • Versuchen Sie, eine passende Datei im Ordner Originaldateien zu finden. Es wird alle Übereinstimmungen betrachten, aber Aliase ignorieren.

  • Entfernen Sie die alte Alias-Datei (überprüfen Sie zuerst, ob es sich um eine Alias-Datei handelt)

  • Erstellen Sie aus der gefundenen übereinstimmenden Datei einen Symlink in dem Ordner, in dem sich der alte Alias ​​befand.

  • Nur Alias-Dateien sollten gelöscht werden. Wenn keine übereinstimmende Datei gefunden wird, wird die Alias-Datei nicht gelöscht. Es wird auch kein Symlink erstellt.

.

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

Erst testen.. Nutzung auf eigene Gefahr und das alles..

Heilige Shiatsu! Das klingt nach genau dem, was ich brauche. Ich werde es so schnell wie möglich testen! Ich wusste nicht, dass man eine Variable so ziehen und ablegen kann - sehr cool! Leider glaube ich, dass das nur für einzelne Werte funktioniert, nicht für Listen. Aber Ihr Applescript scheint die Antwort zu sein. Es verwendet immer noch einige Shell-Skripte, die ich vermeiden wollte, aber ich habe akzeptiert, dass es wahrscheinlich keinen anderen Weg gibt. Danke, werde berichten, ob dies das Problem für mich löst!
Schließen, aber keine Zigarre. Es hat 2 defekte Aliase in den Papierkorb verschoben, aber die Originale von beiden befanden sich in einem Ordner namens "Luftrum". Das Skript erstellte 2 Symlinks dieses Ordners, benannte jeden in die Namen der toten Aliase um und fügte sie an der richtigen Stelle ein. Also habe ich jetzt 2 unterschiedlich benannte, aber ansonsten identische Aliase für einen Ordner, der andere Elemente als nur die eigentlichen toten Alias-Elemente enthält. Ich werde versuchen, dies selbst zu beheben, aber Sie können es möglicherweise schneller tun, und wenn Sie Ihre Antwort bearbeiten können, würde ich mich freuen!
Zusätzliche Beobachtung, es stirbt bei Dateinamen, die kaufmännische Und-Zeichen enthalten. Sieht so aus, als müssten sie maskiert werden, aber ich bin mir nicht sicher, wie die Syntax dafür ist.
Oh oh ... ein weiteres ernstes Problem ist, dass ich in einigen Fällen mehrere Aliase habe. Das Skript geht also davon aus, dass der erste gefundene übereinstimmende Dateiname das Original ist, obwohl dies möglicherweise nicht der Fall ist. Sollte auch überprüfen, ob es kein Alias ​​ist. Ich werde versuchen, das selbst zu beheben, aber falls ich scheitere, wäre es erstaunlich, wenn Sie diese Anpassung ebenfalls vornehmen könnten. =)
Hallo. Ich bekomme Ihre ersten beiden Probleme nicht, wenn ich Tests durchführe. Das erste Problem, wenn ich Sie richtig verstehe, klingt so, als würde das Skript die Originaldateien finden, aber die Dateinamen werden nicht an den Symlink-Code übergeben. Auch das Testen auf einem ie in einem Ordner namens "ein Ordner mit & ya" funktioniert für mich. Applescript kann Probleme mit einigen Sprachen und deren Textcodierung haben, wenn es um Dateien und Ordner geht. Ich vermute, dass dies der Fall ist. Aber Sie müssen wirklich ein Beispiel dafür zeigen, wie Ihr Alias ​​und Ihre Dateien organisiert sind und wie Ihre Liste strukturiert ist. Und ersparen Sie uns die Arbeit an Ihrer ausformulierten Beschreibung.
Ich würde das gerne tun, diese Kommentarfelder erlauben mir einfach nicht, Dinge wie das Anhängen von Screenshots oder das Formatieren von Text in lesbarerer Weise zu tun. Ich denke, ich kann meine ursprüngliche Frage bearbeiten ... aber das scheint seltsam, da die Ergänzungen ausschließlich für Ihre Antwort gelten. Wie schlagen Sie vor, dass ich Ihnen die Details zur Verfügung stelle, die helfen würden?
Sie können es in Ihrer Frage zeigen. Zeigt ein Beispiel für die Struktur der Listen, Screenshots, wie Ihre Dateien organisiert sind. usw. erweitert Ihre Frage um relevante Informationen. Stellen Sie nur sicher, dass Sie erklären, welche Teile welche sind. :-) Dies gibt uns eine Vorstellung davon, was Sie wirklich versuchen zu tun. (Ich hoffe)
Antwort aktualisiert.
Interessantes Update, werde ich mir ansehen. Ich bin jedoch neugierig, warum Sie eine externe Datei verwenden, um zu speichern, was Variablen sind, wenn Sie Variablen bereits im Automator zuweisen und später abrufen können. Gibt es einen Nachteil bei der Verwendung von Variablen mit Automator?
Ich habe diesen Workflow erstellt und er läuft ohne Fehler. Es bringt aber auch nichts. Die Werte aller Eigenschaften in MyProperties.scpt sind leer.
Ich möchte mehr als eine Variable an das endgültige Skript übergeben. Wenn ich das auf die normale Weise mache, kann ich das nicht tun. SO VIEL ICH WEISS. Ich wollte es nicht komplizierter machen, als es ohnehin schon ist.
Wenn Sie die MyProperties.scpt öffnen, erscheinen sie leer. Aber wenn Ihr Skript korrekt ausgeführt wurde, befinden sich die Werte in den Eigenschaften, unabhängig davon, ob Sie die Datei öffnen. Ich vermute da vielleicht einen Konstruktionsfehler. Ich kann einen Link zu meinem Arbeitsablauf posten.
Danke, ich werde auf Ihren Link warten und ihn mit meinem eigenen vergleichen. Ich sehe keinen Fehler in der Konstruktion, alles läuft perfekt bis zum endgültigen Skript, das einfach keine Ergebnisse zurückgibt. Werde es aber herausfinden sobald du deine gepostet hast. Danke noch einmal!
Aha! Du hattest Recht, ich hatte eine "Eingabe ignorieren" übersehen. Jetzt läuft es und scheint korrekt funktioniert zu haben - mit einer Ausnahme. Es bleibt ein einziger Alias ​​zurück, der ignoriert wurde, und ich sehe keinen offensichtlichen Grund dafür. Ich werde dies in größerem Maßstab etwas weiter untersuchen und sehen, ob es auf andere Probleme stößt. Nochmals vielen Dank! Ich werde Ihnen das Kopfgeld in Kürze zusprechen, vorausgesetzt, dass keine weiteren Folgefragen erforderlich sind.
Es scheint noch 1 Problem zu geben, mit dem ich leben und das ich bei Bedarf umgehen kann. 1) Irgendwie haben sich viele meiner Aliase selbst als Originaldatei festgelegt, und wenn er auf diese Dateien trifft, springt der Workflow direkt an ihnen vorbei. Wenn Sie das Problem, das dieses Problem verursacht, leicht erkennen können, großartig. Aber wenn nicht, dann kann ich es ziemlich einfach umgehen.
2 zusätzliche Probleme: 1) Nachdem ich 5 bis 10 Minuten gelaufen war, beschloss ich, den Papierkorb zu leeren, der sich schnell füllte. Dies führte dazu, dass der Workflow aufgrund von „Finder ist ausgelastet“ abgebrochen wurde, und wenn ich versuche, ihn erneut auszuführen, schlägt er sofort nach der Auswahl des ersten Ordners mit „Too many files open“ fehl. Wenn Sie Automator beenden und neu starten, kann er wieder ausgeführt werden. 2) Die Geschwindigkeit, mit der die Operationen ausgeführt werden, verlangsamt sich mit jedem erzeugten Symlink. Die ersten paar gehen sehr schnell, aber nach ungefähr 100 wird es offensichtlich langsamer, und nach mehreren hundert dauert es ein paar Sekunden pro Verbindung.
Wenn ich min. Ich könnte es wahrscheinlich so einstellen, dass es alle Übereinstimmungen sammelt, alle Symlinks, die es tun muss, alle Löschungen zuerst in Listen. Führen Sie dann jede Operation auf einmal durch. Aber so etwas zu tun wird eine Weile dauern, wenn Sie es für so viele Dateien tun, wie Sie vorschlagen.
Ja das macht Sinn. Wenn Sie nicht gerade Lust auf die Übung haben, sage ich persönlich, dass Sie sich nicht die Mühe machen müssen. Das bringt mich dahin, wo ich sein musste, und ich kann Ihnen nicht genug danken! Habe Ihnen das Kopfgeld zugesprochen und dies als Lösung markiert. Alles, was Sie darüber hinaus tun, ist reine Großzügigkeit. :)
Falls Sie daran interessiert sind, meinen Fortschritt damit zu verfolgen ... Ich habe ein neues Problem, das ich als eine andere Frage gepostet habe - apple.stackexchange.com/questions/101878/…

Normalerweise bezieht sich "kaputter Alias" auf einen Alias, bei dem die Originaldatei nicht mehr existiert. Ich habe dieses Skript verwendet, um solche Aliase zu finden:

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

Wenn das Skript die Aliase findet, die Sie symbolische Links ersetzen möchten, speichern Sie die relevanten Zeilen der Ausgabe in einer Textdatei. Versuchen Sie dann, ein Shell-Skript wie folgt auszuführen:

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
Leider(?) nicht so in meinem Fall. Die Originaldateien existieren. Ich weiß nicht, warum die Aliase kaputt gegangen sind. Wenn ich mir Get Info anschaue, sehe ich, dass sie alle auf SELBST als das Original verweisen. Auch in Ihrem Code (und ich bin kein großer AppleScripter, also verzeihen Sie mir) scheint es damit zu beginnen, einen Alias ​​​​für alles in einem gesamten Verzeichnis zu erstellen. Warum das? Mir ist nicht klar, was das tun würde, um zu helfen. Ich iteriere derzeit alle Aliase in einem Verzeichnis und versuche, den ursprünglichen Inhalt zu erhalten, und wenn dies fehlschlägt, weiß ich, dass ich einen kaputten Alias ​​habe. Sie zu finden ist also einfach, es ist ihre Originaldatei zu finden, an der ich feststecke.
alias files of entire contents of (POSIX file "/Users/username" as alias)bekommt nur eine Liste aller Alias-Dateien unter /Users/username. Sie können auch versuchen, die ursprünglichen Pfade aus den Ressourcenzweigen mit etwas wie zu extrahieren cat example.txt\ alias/..namedfork/rsrc | strings.
Ich habe bereits alle Alias-Dateien und alle ihre Pfade. Automator hat mir das leicht gemacht, das ist nicht das Problem. Das Problem ist, dass ich keine Suche nach den Dateinamen durchführen kann, um die Originaldateien an anderer Stelle auf meinem Laufwerk zu finden. Sie existieren und befinden sich irgendwo unterhalb eines bestimmten Verzeichnisses, könnten sich aber in einem von Hunderten anderer Unterverzeichnisse befinden.

mdfindSie könnten die Befehlszeilenversion von Spotlight in einem Shell-Subskript in Automator verwenden . Sie können Variablen an und von diesem Skript/Befehl über stdin und stdout übergeben.

BEARBEITEN , wenn Sie keine Shell-Befehle verwenden möchten:

Haben Sie versucht, einen Wert einer Variablen in Automator festzulegen, dann mit der rechten Maustaste auf das Spotlight-Eingabefeld zu klicken und unten in der Popup-Liste "Neue Variable ..." auszuwählen?

Spotlight-Screenshot...

Danke, aber ohne viel mehr Details, das ist über meinem Kopf. Ich möchte wirklich vermeiden, dass ich außerhalb von Automator auf Shell-Skripte umsteigen muss. Höchstens würde ich es vorziehen, bei einfachem Applescript zu bleiben, aber selbst das wäre ein letzter Ausweg. Ich möchte nur eine Variable als Eingabe an das Spotlight-Modul übergeben.
Ich habe die Bearbeitung dieses Kommentars gerade erst bemerkt. Ich kann eine Variable nicht auf diese Weise verwenden, da die Eingabe eine Liste von Elementen ist und der Automator Listen nicht auf die obige Weise behandelt. Sie müssen auf AppleScript oder Shell-Scripting zurückgreifen. =(