Использование Apple Automator для передачи имен файлов в сценарий оболочки - PullRequest
12 голосов
/ 07 декабря 2009

У меня есть скрипт automator, который я хотел бы запустить в папке. Я хочу, чтобы скрипт взял каждый файл в папке и запустил на нем команду оболочки. Automator настроен на передачу ввода в stdin, но я не думаю, что я правильно использую stdin ниже, не могли бы вы помочь?

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

Ответы [ 4 ]

10 голосов
/ 07 декабря 2009

Специальная переменная $@ представляет все аргументы командной строки, предоставленные сценарию.

Цикл for проходит по каждому из них и каждый раз запускает файл JAR. Вы можете сократить скрипт до:

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

, поскольку по умолчанию for используется $@.

Вы должны поместить кавычки около $ f в конце команды java, если в аргументах есть пробелы.

8 голосов
/ 31 августа 2012

Вы правы, когда говорите, что "неправильно используете stdin". Фактически, из предоставленного вами фрагмента сценария ваш сценарий предполагает, что вы получаете файлы в качестве аргументов в командной строке ... вы вообще не используете stdin!

В правом верхнем углу действия «Выполнить сценарий оболочки» под знаком X находится раскрывающийся список с двумя параметрами: «Передать ввод: в stdin» и «Передать ввод: в качестве аргументов». Эти параметры определяют, как выбранные файлы передаются в действие сценария. Если выбрана опция «в качестве аргументов», ваш скрипт должен использовать следующий шаблон

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

Этот шаблон предоставляется самим действием, когда выбран «в качестве аргументов».

С другой стороны, если выбрана опция 'to stdin', то ваш скрипт должен использовать эту тамплату:

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

(Если вы не знаете сценариев bash, все, что после # в строке - это комментарий)

Обратите внимание, что шаблон, предоставленный действием сценария, является простой единой командой

cat

На мой взгляд, не очень полезно.

Обратите внимание, что до тех пор, пока вы на самом деле не введете текст в область скрипта, переключение между «на stdin» и «в качестве аргументов» будет изменять содержимое поля скрипта (я предполагаю, что это подсказка к тому, как должен выглядеть ваш скрипт), но один раз Вы вводите что-то, переключение больше не происходит.

5 голосов
/ 09 декабря 2011

Исходя из того, что я видел здесь, вы можете настроить удобный «сервис», который позволит вам щелкать правой кнопкой мыши и конвертировать файлы с помощью контекстного меню в Finder.

Чтобы настроить это:

  • Launch Automator
  • В главном меню выберите «Новый»
  • Выберите «Сервис» (значок шестеренки)
  • Перетащите «Утилиты -> Выполнить сценарий оболочки» из левой библиотеки в основную область «редактора».
  • Заменить существующий текст "кошка" следующим кодом:

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

    ПРИМЕЧАНИЕ. Приведенная выше конфигурация преобразуется в моно (-c 1 --mix) при 16 битах при 32000 Гц (LEI16 @ 32000 = 16-битная последовательность с прямым порядком байтов). Используйте / usr / bin / afconvert -h в терминале, чтобы увидеть все доступные опции.

  • В верхней части редактора вы должны увидеть два раскрывающихся списка, установите их следующим образом:

    Service receives selected [Files and Folders] in [Finder.app]
    
  • В области редактора сценариев оболочки:

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

    и

    "pass input" is set to "arguments" 
    
  • Сохраните что-то вроде "Преобразовать в CAF"

  • Перейдите в папку с несколькими файлами WAV.
  • Щелкните правой кнопкой мыши по WAV, и вы увидите надпись «Преобразовать в CAF» в нижней части контекстного меню.
2 голосов
/ 07 декабря 2009

Я не уверен, что понимаю ваш вопрос, так как ваш скрипт, похоже, не использует stdin. Специальный параметр $ @ расширяется до позиционных параметров, передаваемых в качестве аргументов в argv. Он работает так же, как если бы вы вызывали скрипт напрямую из оболочки:

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

Если вы хотите получить аргументы от stdin, вы можете сделать что-то вроде этого:

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