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:
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:
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:
Was ich also tun muss, ist:
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:
Jetzt geht es etwas weiter, aber mit einigen Problemen:
Hoffentlich reichen diese Details aus, um letztendlich zu einer funktionierenden Lösung zu gelangen. Ich kann sagen, es ist sehr nah.
Wenn Sie einfach einen Dateinamen an die Spotlight-Aktion übergeben möchten
Der Dateiname wird von einer Aktion an eine Set-Variable Action übergeben
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.
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“.
3, Führen Sie Applescript aus:
(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:
5, Finder-Elemente filtern:
Alle: Art : ist : andere : Alias
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.
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..
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
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
.mdfind
Sie 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?
Beroe
Markhunte
JVC
Markhunte