Wie erstelle ich einen OS X-Dienst, der den Pfad einer Datei an ein Shell-Skript übergibt?

3

Ich habe ein Shell-Skript, das zwei Argumente akzeptiert:

  • vollständiger Dateipfad
  • Dateiname

Wie kann ich mit Automator einen Kontextmenüeintrag in Finder einfügen, um das Shell-Skript mit einem ausgewählten Dateipfad und Dateinamen als Argumente auszuführen?

Milen
quelle

Antworten:

7

Wählen Sie diese Option, um in Automator einen Dienst zu erstellen , der ausgewählte Dateien und Ordner nur als Eingabe in Finder empfängt . Fügen Sie die Aktion " Shell-Skript ausführen" hinzu und übergeben Sie die Eingabe als Argumente .

Die Argumente, die Sie erhalten, sind die vollständigen Unix-Pfade der ausgewählten Dateien und Ordner. Verwenden eines growlnotifyTeils von Growl zu Demonstrationszwecken:

Bildbeschreibung hier eingeben

Growl-Nachricht als Ergebnis der Ausführung in einer Datei:

Bildbeschreibung hier eingeben

Der Befehl wird im Kontextmenü einer Datei oder eines Ordners im Finder angezeigt. Wenn zu viele zutreffende Dienste vorhanden sind , werden sie in einem Untermenü Dienste gruppiert .

Bildbeschreibung hier eingeben


Wenn für Ihr Skript sowohl der vollständige Dateipfad als auch der Dateiname erforderlich sind , können Sie wie folgt vorgehen, indem Sie zuerst den Dateinamen aus dem vollständigen Pfad extrahieren:

for f in "$@"
do
    name="$( basename $f )"
    /usr/local/bin/growlnotify "$name" -m "$f"
done

Sie können sehen, dass der Dateiname als Titel verwendet wird, während der Pfad in Growl als Meldung verwendet wird:

Bildbeschreibung hier eingeben


Wenn Sie zusätzliche Eingaben abfragen müssen, können Sie dazu ein kurzes AppleScript ausführen. Das Folgende ist ein vollständiges Shell-Skript (wie das growlnotifyoben beschriebene), das Eingaben abfragt und die ausgewählte Datei in diesen neuen Namen umbenennt. Ich habe die Fehlerbehandlung nicht berücksichtigt. Wenn Sie beispielsweise Doppelpunkte und Schrägstriche zum neuen Dateinamen hinzufügen, wird das Skript wahrscheinlich beschädigt.

    # repeat for every file in selection
for f in "$@"
do
    # capture input of a simple dialog in AppleScript
    OUT=$( osascript -e "tell application \"System Events\" to text returned of (display dialog \"New Name of $f:\" default answer \"\")" )
    # if the user canceled, skip to the next file
    [[ $? -eq 0 ]] || continue
    # old file name is the loop variable
    OLD="$f"
    # new file name is the same directory, plus the user's input
    NEW="$( dirname "$OLD" )/$OUT"
    # print a message announcing the rename
    /usr/local/bin/growlnotify "Renaming…" -m "$OLD to $NEW"
    # perform the actual rename
    mv "$OLD" "$NEW"
done

Screenshot einer Beispielaktion zum Umbenennen, die angekündigt wurde über growlnotify:

Bildbeschreibung hier eingeben

Daniel Beck
quelle
Es hat wie Zauberei funktioniert. Vielen Dank!!! Außerdem benutze ich growlnotifier, um die Ergebnisse der Operation anzuzeigen. Eine Frage, wo sind die Dienste gespeichert? Es wurde kein Standort abgefragt. Es ist nicht da in ~ / Library
Milen
@Milen ~/Library/Services, und Sie können jederzeit Command+Clickden Namen eines Dokuments (in diesem Fall den Dienst in Automator) eingeben , um den vollständigen Pfad in einem Popup-Menü anzuzeigen.
Daniel Beck