Verwenden Sie den Automator von Apple, um Dateinamen an ein Shell -Skript zu übergeben

StackOverflow https://stackoverflow.com/questions/1857050

  •  13-09-2019
  •  | 
  •  

Frage

Ich habe ein Automator -Skript, das ich gerne auf einem Ordner ausführen möchte. Ich möchte, dass das Skript jede Datei in den Ordner aufnimmt und meinen Befehl Shell darauf ausführt. Der Automator ist so eingestellt, dass Sie die Eingabe an stdin übergeben, aber ich glaube nicht, dass ich stdin unten korrekt verwende. Können Sie bitte helfen?

for f in "$@" 
do
    java -Xmx1000m -jar /Users/myprog/myprog.jar $f 
done
War es hilfreich?

Lösung

Die besondere Variable $@ Repräsentiert alle Befehlszeilenargumente, die dem Skript zur Verfügung gestellt werden.

Das for Schleifen Sie jedes Mal durch und führen die JAR -Datei durch. Sie könnten das Drehbuch verkürzen an:

for f
do
    java -Xmx1000m -jar /Users/myprog/myprog.jar "$f"
done

Seit dem Standardverhalten von for ist zu verwenden $@.

Sie sollten Zitate am Ende des Java -Befehls rund $ f geben, falls es Räume in den Argumenten gibt.

Andere Tipps

Sie haben Recht, wenn Sie sagen, dass Sie "Stdin nicht richtig verwenden". Aus dem von Ihnen bereitgestellten Skript -Snippet geht Ihr Skript aus, dass Sie die Dateien als Argumente in der Befehlszeile erhalten ... Sie verwenden Stdin überhaupt nicht!

In der oberen rechten Ecke der Aktion des Run Shell -Skripts befindet sich unter dem X ein Dropdown -Box mit 2 Optionen: 'Eingabetaste: an stdin' und 'Intput: As Argumente'. Diese Optionen bestimmen, wie die ausgewählten Dateien an Ihre Skriptaktion übergeben werden. Wenn die Option "AS Argumente" ausgewählt ist, sollte Ihr Skript die folgende Vorlage verwenden

for f in "$@"; do
# so stuff here
done

Diese Vorlage wird von der Aktion selbst bereitgestellt, wenn "als Argumente" ausgewählt wird.

Wenn die Option 'zu Stdin' ausgewählt ist, sollte das Skript diese Tamplate verwenden:

while read fname; do  # read each line - assumes one file name per line
   # do clever stuff with the filename
   echo $fname # to illustrate we'll simply copy the filename to stdout
done

(Für den Fall, dass Sie Bash Scripting nicht wissen, ist alles nach der # in einer Zeile ein Kommentar)

Beachten Sie, dass die von der Skriptaktion bereitgestellte Vorlage der einfache, einzelne Befehl ist

cat

Meiner Meinung nach nicht sehr hilfreich.

Beachten Sie, dass bis Sie tatsächlich einen Text in den Skriptbereich eingeben. Wenn Sie zwischen 'Stdin' und 'As Argumente' wechseln, wird der Inhalt des Skriptfelds geändert (ich gehe davon aus Das Umschalten passiert nicht mehr.

Basierend auf dem, was ich hier gesehen habe, können Sie einen praktischen "Dienst" einrichten, mit dem Sie mit dem Kontextmenü im Finder mit der rechten Maustaste klicken und konvertieren können.

Um dies einzurichten:

  • Automator starten
  • Wählen Sie im Hauptmenü "neu"
  • Wählen Sie "Service" (das Zahnradsymbol)
  • Drag & Drop "Dienstprogramme -> Shell -Skript ausführen" aus der linken Bibliothek in den Hauptbereich "Editor".
  • Ersetzen Sie den vorhandenen Text "Katze" durch den folgenden Code:

    for f in "$@"; do
        /usr/bin/afconvert -f caff -d LEI16@32000 -c 1 --mix "$f"
        echo "$f converted"
    done
    

    Hinweis: Das obige Setup wird bei 16 Bit @ 32000Hz (Lei16 @ 32000 = Little Endian 16 Bit) in Mono (-c 1--mix) konvertiert. Verwenden Sie/usr/bin/afconvert -h im Terminal, um alle verfügbaren Optionen anzuzeigen.

  • An der Spitze des Editors sollten Sie zwei Drop -Downs sehen und wie folgt festlegen:

    Service receives selected [Files and Folders] in [Finder.app]
    
  • Stellen Sie im Bereich Shell Skript Editor sicher:

    "Shell" is set to "/bin/bash"
    

    und

    "pass input" is set to "arguments" 
    
  • Speichern Sie das Ding wie "Konvertieren in CAF"

  • Navigieren Sie mit einigen Wellen zu einem Ordner.
  • Klicken Sie mit der rechten Maustaste auf ein WAV und Sie sollten unten im Kontextmenü "In CAF konvertieren" sehen.

Ich bin mir nicht sicher, ob ich Ihre Frage verstehe, da Ihr Skript Stdin nicht zu verwenden scheint. Das $@ Special Parameter Erweitert auf die Positionsparameter als Argumente in Argv. Es funktioniert genauso wie Sie das Skript direkt aus der Shell auf diese Weise angerufen haben:

$ cat >test
for f in "$@"
do
  echo $f
done
$ chmod 755 test
$ ./test a b c
a
b
c

Wenn Sie die Argumente von Stdin bekommen wollten, Sie könnte So etwas tun:

$ cat >test2
for f in $(cat)
do
  echo $f
done
$ chmod 755 test2
$ ./test2 <<EOF
> a b c
> EOF
a
b
c
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top