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

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

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

4 ответов


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

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

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

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

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


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

в правом верхнем углу действия сценария Run Shell под X находится раскрывающееся окно с 2 параметрами: "Pass input: to stdin" и "Pass intput: as arguments". Эти параметры определяют, как выбранные файлы передаются на ваш сценарий. Если опция "в качестве аргументов" выбрана, ваш скрипт должен использовать следующий шаблон

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" и "as arguments" изменит содержимое окна скрипта (я предполагаю, что это намек на то, как должен выглядеть ваш скрипт), но как только вы введете что-то, переключение больше не произойдет.


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

для этого:

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

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

    Примечание: установка выше преобразует в mono (- c 1 --mix) на 16 бит @ 32000hz (LEI16@32000 = little endian 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"

  • перейдите к папке с некоторыми WAVs там.
  • щелкните правой кнопкой мыши на WAV, и вы увидите "конвертировать в CAF" в нижней части контекстного меню.

Я не уверен, что понимаю ваш вопрос, так как ваш скрипт, похоже, не использует stdin. The специальный параметр$@ расширяется до позиционных параметров, переданных в качестве аргументов в 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