2009-12-06 9 views
11

Ho uno script di automazione che mi piacerebbe eseguire su una cartella. Voglio che lo script prenda ogni file nella cartella ed esegua il mio comando shell su di esso. Automator è impostato per passare l'input allo stdin, ma non penso che stia usando lo stdin correttamente sotto, puoi aiutare per favore?Utilizzo di Automator di apple per passare il nome del file in uno script di shell

for f in "[email protected]" 
do 
    java -Xmx1000m -jar /Users/myprog/myprog.jar $f 
done 

risposta

9

La variabile speciale [email protected] rappresenta tutti gli argomenti della riga di comando forniti allo script.

Il ciclo for passa attraverso ciascuna ed esegue il file jar ogni volta. Si potrebbe accorciare lo script:

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

dal momento che il comportamento predefinito di for è quello di utilizzare [email protected].

Si dovrebbero mettere le virgolette attorno a $ f alla fine del comando java nel caso ci siano spazi negli argomenti.

2

Non sono sicuro di aver compreso la tua domanda poiché il tuo script non sembra utilizzare lo stdin. Lo [email protected] special parameter si espande ai parametri posizionali passati come argomenti in argv. Funziona allo stesso modo come se si chiama lo script direttamente dalla shell in questo modo:

$ cat >test 
for f in "[email protected]" 
do 
    echo $f 
done 
$ chmod 755 test 
$ ./test a b c 
a 
b 
c 

Se si voleva ottenere gli argomenti da stdin, si potrebbe fare qualcosa di simile:

$ cat >test2 
for f in $(cat) 
do 
    echo $f 
done 
$ chmod 755 test2 
$ ./test2 <<EOF 
> a b c 
> EOF 
a 
b 
c 
5

Sulla base di ciò che ho visto qui, è possibile impostare un pratico "servizio" che consente di fare clic con il pulsante destro del mouse e convertire i file utilizzando il menu contestuale nel mirino.

Per impostare questa funzione:

  • lancio Automator
  • Dal menu principale scegliere
  • Selezionare "Servizio" "Nuovo" (l'icona ingranaggio)
  • drag and drop "Utilità -> Esegui Shell Script "dalla libreria di sinistra nell'area principale" editor ".
  • Sostituire il testo "del gatto" esistente con il seguente codice:

    for f in "[email protected]"; do 
        /usr/bin/afconvert -f caff -d [email protected] -c 1 --mix "$f" 
        echo "$f converted" 
    done 
    

    NOTA: La configurazione sopra convertirà in mono (-c 1 --mix) a 16 bit @ 32000Hz (LEI16 @ 32000 = little endian 16 bit). Usa/usr/bin/afconvert -h nel terminale per vedere tutte le opzioni disponibili.

  • In cima l'editor si dovrebbe vedere due elenchi a discesa, li impostate come segue:

    Service receives selected [Files and Folders] in [Finder.app] 
    
  • Nell'area Editor Shell Script, assicurano:

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

    e

    "pass input" is set to "arguments" 
    
  • Salvare qualcosa come "Converti in CAF"

  • Passare a una cartella con alcuni WAV in là.
  • Fare clic con il tasto destro su un WAV e si dovrebbe vedere "Converti in CAF" nella parte inferiore del menu contestuale.
7

Hai ragione quando dici di "non usare lo stdin correttamente". Infatti, dallo snippet di script che hai fornito, il tuo script presuppone che stai ricevendo i file come argomenti sulla riga di comando ... non stai usando lo stdin!

Nell'angolo in alto a destra dell'azione Esegui script shell, sotto la X è presente una casella a discesa con 2 opzioni: "Passa input: per stdin" e "Passa intput: come argomenti". Queste opzioni determinano il modo in cui i file selezionati vengono passati all'azione di script. Se viene selezionata l'opzione 'come argomenti', lo script dovrebbe utilizzare il seguente modello

for f in "[email protected]"; do 
# so stuff here 
done 

Questo modello è fornito con l'azione in sé, quando 'come argomenti' sia selezionata.

D'altra parte, se è selezionata l'opzione 'a stdin', allora si dovrebbe usare questo script di tamplate:

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 

(Nel caso in cui non si conosce lo scripting bash, tutto dopo il # su una riga è un commento)

si noti che il modello fornito dall'azione script è il semplice, singolo comando

cat 

Non molto utile a mio parere.

Si noti che finché non si immette effettivamente testo nell'area di script, il passaggio da "a stdin" a "come argomenti" modificherà il contenuto della casella di script (presumo che questo sia un suggerimento su come dovrebbe essere lo script) ma una volta inserito qualcosa, la commutazione non avviene più.

Problemi correlati