Использование Apple Automator для передачи имен файлов в сценарий оболочки

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

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

person John    schedule 06.12.2009    source источник


Ответы (4)


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

Цикл for проходит через каждый из них и каждый раз выполняет файл jar. Вы можете сократить сценарий до:

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

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

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

person Dennis Williamson    schedule 07.12.2009

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

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

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

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

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

person ehzone    schedule 31.08.2012

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

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

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

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

    ПРИМЕЧАНИЕ. Приведенная выше установка преобразует звук в моно (-c 1 --mix) с разрядностью 16 бит при частоте 32 000 Гц (LEI16 при 32 000 = 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» в нижней части контекстного меню.
person bob    schedule 09.12.2011

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

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

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

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