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

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

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

Ответ 1

Специальная переменная [email protected] представляет все аргументы командной строки, предоставленные script.

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

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

поскольку поведение for по умолчанию заключается в использовании [email protected].

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

Ответ 2

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

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

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

Этот шаблон предоставляется самим действием, когда выбрано "as arguments".

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

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, все после # в строке является комментарием)

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

cat

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

Обратите внимание, что до тех пор, пока вы фактически не введете текст в область script, изменение между 'to stdin' и 'as arguments' изменит содержимое поля script (я предполагаю, что это подсказка, что ваш script должен выглядеть), но как только вы что-то вводите, переключение больше не происходит.

Ответ 3

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

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

  • Запуск Automator
  • В главном меню выберите "Новый"
  • Выберите "Сервис" (значок передачи)
  • Перетащите "Утилиты → Запустить оболочку Script" из левой библиотеки в основную область "Редактор".
  • Замените существующий текст "cat" на следующий код:

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

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

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

    Service receives selected [Files and Folders] in [Finder.app]
    
  • В области редактора оболочки Script убедитесь, что:

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

    и

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

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

Ответ 4

Я не уверен, что я понимаю ваш вопрос, так как ваш script, похоже, не использует stdin. [email protected]специальный параметр расширяется до позиционных параметров, переданных в качестве аргументов в argv. Он работает так же, как если бы вы вызывали script непосредственно из оболочки следующим образом:

$ cat >test
for f in "[email protected]"
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