Использование 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