Wie führe ich ein Shell-Skript mit ausgewählten Dateien / Ordnern im Finder aus?

13

Ich komme aus Linux, wo es einfach ist, ein Skript für eine Reihe von Dateien in Nautilus oder Delphin auszuführen, aber ich war überrascht, dass dies in OSX nicht einfach ist.

Am liebsten würde ich in der Lage sein, bei gedrückter Strg-Taste auf eine Auswahl im Finder zu klicken, mein Skript auszuwählen und ein Terminalfenster zu öffnen, um den Fortschritt oder eine Benutzerinteraktion anzuzeigen.

Jeremy Cantrell
quelle

Antworten:

8

Am einfachsten ist dies, wenn Sie die Elemente aus dem Finder in ein Terminalfenster ziehen . Wenn Sie sie löschen, gibt Terminal die Pfadnamen (mit Escape-Zeichen) ein. Sie können dann die Befehlszeilenbearbeitung Ihrer Shell verwenden, um den Rest des Befehls einzugeben. Wenn Sie vorausdenken, können Sie den Befehl zuerst eingeben und dann die Elemente hineinziehen.

Die "Drag First" -Version:

  1. Wählen Sie einige Finder- Elemente aus und ziehen Sie sie in ein Terminalfenster , in dem eine Shell-Eingabeaufforderung angezeigt wird. Das Terminal fügt die (mit Escape-Zeichen versehenen) Pfadnamen ein.
  2. Geben Sie Control+ A(gehen Sie zu dem Anfang der Zeile; ^A ist die Standardeinstellung, sondern variiert von Shell / Konfiguration).
  3. Geben Sie Ihren Befehl und ein Leerzeichen ein (es wird vor den Pfadnamen eingefügt).

Die "Thinking Ahead" -Version:

  1. Führen Sie in beliebiger Reihenfolge beide Schritte aus:
    • Geben Sie in einem Terminalfenster den ersten Teil Ihres Befehls und das Leerzeichen ein (alles außer den Pfadnamen).
    • Wählen Sie einige Elemente im Finder aus .
  2. Ziehen Sie die ausgewählten Elemente aus dem Finder in das Terminalfenster , in das Sie den Befehl eingegeben haben.
  3. Aktivieren Sie das Terminalfenster und drücken Sie Return.

Sie können sich (wie andere Antworten gezeigt haben) an AppleScript oder Automator wenden, wenn Sie eine stärker automatisierte Lösung benötigen. Da die zusätzlichen "beweglichen Teile" die Lösung etwas komplizierter machen können, müssen Sie die Vorteile des obigen Prozesses (manuell, aber flexibel) gegen die Komplexität der Implementierung einer oder mehrerer der automatisierten Lösungen abwägen.

Einige der Automatisierungsmöglichkeiten umfassen:

  • eine AppleScript-Droplet-Anwendung
  • Ein einfaches AppleScript-Programm, das über das integrierte Skriptmenü oder einen anderen Starter gestartet wird
    • Abrufen von Pfadnamen aus der Finder -Auswahl
  • einen Automator-Workflow, eine Anwendung oder ein Finder- Plug-in
  • Eine ausführbare .commandDatei (normalerweise ein Shell-Skript; im Finder öffnen , um sie im Terminal auszuführen )
    • Abrufen von Pfadnamen aus der Finder -Auswahl (über JavaScript )
  • Tools von Drittanbietern, die bereits die von Ihnen benötigten Funktionen bereitstellen
Chris Johnsen
quelle
7

Ich glaube nicht, dass es einen Weg gibt, dies direkt zu tun. Sie können eine "Automator" -Anwendung erstellen, die einige der gewünschten Aufgaben ausführt. Dies zeigt, wie der Automator-Stack aussehen würde:

Bildbeschreibung hier eingeben

Speichern Sie das Ergebnis als Anwendung, wählen Sie im Finder die Dateien aus, klicken Sie mit der rechten Maustaste und wählen Sie "Öffnen mit" und wählen Sie dann Ihre Anwendung aus. (Möglicherweise müssen Sie unten in der Anwendungsliste "Andere ..." auswählen.)

Mit dieser Methode können Sie nicht mit dem Skript interagieren, aber Sie können die Dateien durchlaufen, um ein Shell-Skript auszuführen.

Peter Murray
quelle
Es ist noch einfacher, wenn Sie die Dateien über das Anwendungssymbol ziehen und ablegen.
Kiamlaluno
5

Services sind, wie mit Dingen .

Unter dem Anwendungsmenü (in diesem Fall "Finder") befindet sich (fast) immer eine ServicesMenüoption, die Dienste bereitstellt, die für die aktuelle Anwendung und ihren aktuellen Status gelten. Typischerweise ist der Status der ausgewählte Objekttyp (Text, Dateien / Ordner usw.).

Sie können in den Systemeinstellungen aktiviert, deaktiviert und Tastenkombinationen zugewiesen werden, die nur für die letzten drei Optionen sinnvoll sind Keyboard.

Tastatürkürzel

So erstellen Sie einen Dienst, der ein Shell-Skript auf Dateien / Ordner im Finder anwendet:

Starten Sie den und erstellen Sie ein neues ServiceDokument.

Neuer Service

  • Legen Sie den Objekttyp fest, auf den sich der Service bezieht ( files or folders)
  • Stellen Sie die Anwendung ein, in der der Dienst verfügbar ist ( )
    • Alternativ gibt es eine Get Selected Finder ItemsAktion.
  • eine Aktion von hinzufügen Run Shell Script
  • Entscheiden Sie, ob Sie die Eingabe als Argumente oder als wünschen

Es sollte ungefähr so ​​aussehen:

Beispiel Shell-Skript

legt es ~/Library/Servicesbeim Speichern automatisch in Ihrem Ordner ab, wodurch es (fast) sofort über das Application -> ServicesMenü oder das Kontextmenü (Rechtsklick) verfügbar wird .

Testordner

resultierendes TextEdit Dokument

See
quelle
1

Unter Mac OS X ist Applescript die bevorzugte Skriptsprache. Sie können ein Droplet erstellen (ein Skript, das etwas bewirkt, wenn Sie einige Dateien über das Symbol ziehen), das Skript-Symbol (das als Anwendung gespeichert werden kann) auf dem Desktop platzieren und die zu übergebenden Dateien ziehen und ablegen Skript.

Alternativ können Sie Ordneraktionen verwenden. Es ist möglich, ein Skript Applescript einem Ordner zuzuordnen, der immer dann ausgeführt wird, wenn einige Dateien (oder Verzeichnisse) über dem Ordner abgelegt werden.

kiamlaluno
quelle
1

Ich wollte das auch tun, aber im Gegensatz zu den obigen Lösungen wollte ich zitierte Parameter für ein Shell-Skript erstellen. Diese anderen Methoden sind in Ordnung, aber sie sehen so aus, als würden Sie "nur Befehl-V in Terminal" vorschlagen, wenn Sie wirklich wollen pbpaste.

Ich wollte eine Shell-Funktion erstellen, die ich in meinen Skripten verwenden kann und die zu Dateiparametern für jede Finder-Auswahl erweitert wurde. Ich benutze die Fischschale und das scheint einigermaßen zu funktionieren:

function selection
    osascript -e "tell application \"Finder\" to set s to the selection as alias list" -e "repeat with f in s" -e "set contents of f to POSIX path of f" -e "end repeat" -e "set AppleScript's text item delimiters to linefeed" -e "s as string"
end

Gebraucht (wieder in der Fischschale) wie convert-video (selection).

In einer Bash-Funktion muss die Ausgabe möglicherweise mit etwas zitiert werden, das | tr '\n' '\0' | xargs -0 printf "%q" {}am Ende des Befehls osascript steht, nicht sicher.

(Hinweis: Alles, was ich über fortgeschrittenes Apple- und Shell-Scripting weiß, habe ich in den letzten 2 Stunden neu gelernt und werde es bis morgen vergessen.)

Pierre Houston
quelle
Der Versuch, dies in der letzten Zeit in Bash zu tun, schlug fehl, wurde hier gefragt: superuser.com/questions/1353966 , bekam Antworten, die angaben: nein, nicht möglich: ^ (Bash, du verlierst, wirst auf meinem Arbeits-Mac auch auf Fish Shell umstellen. Hinweis dass ich den von Chris Johnsen oben erwähnten Drag-to-Finder-Trick sehr
Pierre Houston
1

Basierend auf den obigen Antworten habe ich dieses Ding gebaut

https://github.com/commonpike/DropShell

Grundsätzlich eine Applescript-App, die eine in der App befindliche Shell-Datei mit den abgelegten Dateien als Argumente aufruft. Sie können das Shell-Skript nach Bedarf ändern.

Hecht
quelle
0

Basierend auf der Antwort von commonpike habe ich ein AppleScript erstellt, das alle darauf abgelegten Dateien zu einem Shell-Skript mit dem passenden Namen umleitet. Speichern Sie es einfach in Apples ScriptEditor als Anwendung und benennen Sie es in script.app um, damit es zu Ihrem script.sh https://github.com/PHolker/scripts/blob/master/DropScript.scpt passt

PHolker
quelle