3

У меня есть сценарий оболочки, который принимает два аргумента:

  • полный путь к файлу
  • имя файла

Как я могу использовать Automator для добавления пункта контекстного меню в Finder для запуска сценария оболочки с выбранным путем и именем файла в качестве аргументов?

1 ответ1

7

Выберите для создания службы в Automator, которая получает выбранные файлы и папки в качестве входных данных только в Finder. Добавьте действие Run Shell Script и передайте входные данные в качестве аргументов.

Полученные аргументы - это полные пути Unix выбранных файлов и папок. Используя growlnotify , часть Growl для демонстрационных целей:

Ворчание сообщения в результате запуска его в файле:

Команда появляется в контекстном меню файла или папки в Finder. Если имеется слишком много применимых Сервисов, они объединяются в Подменю Сервисов.


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

for f in "$@"
do
    name="$( basename $f )"
    /usr/local/bin/growlnotify "$name" -m "$f"
done

Вы можете видеть, что имя файла используется в качестве заголовка, а путь используется как сообщение в Growl:


Если вам нужно запросить дополнительный ввод, вы можете выполнить короткий AppleScript, чтобы сделать это. Ниже приведен полный сценарий оболочки (например, growlnotify выше), который запрашивает ввод и переименовывает выбранный файл с этим новым именем. Я не включал обработку ошибок и тому подобное, например, добавление двоеточия и косой черты к новому имени файла, скорее всего, сломает скрипт.

    # repeat for every file in selection
for f in "$@"
do
    # capture input of a simple dialog in AppleScript
    OUT=$( osascript -e "tell application \"System Events\" to text returned of (display dialog \"New Name of $f:\" default answer \"\")" )
    # if the user canceled, skip to the next file
    [[ $? -eq 0 ]] || continue
    # old file name is the loop variable
    OLD="$f"
    # new file name is the same directory, plus the user's input
    NEW="$( dirname "$OLD" )/$OUT"
    # print a message announcing the rename
    /usr/local/bin/growlnotify "Renaming…" -m "$OLD to $NEW"
    # perform the actual rename
    mv "$OLD" "$NEW"
done

Снимок экрана примера действия переименования, объявленного при помощи growlnotify:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .