如何创建一个将文件路径传递给 Shell 脚本的 OS X 服务?

如何创建一个将文件路径传递给 Shell 脚本的 OS X 服务?

我有一个接受两个参数的 shell 脚本:

  • 完整文件路径
  • 文件名

如何使用 Automator 向 Finder 添加上下文菜单项,以便使用所选文件路径和文件名作为参数来运行 shell 脚本?

答案1

选择创建一个服务在 Automator 中接收选定的文件和文件夹作为输入发现者仅。添加运行 Shell 脚本行动和将输入作为参数传递

您收到的参数是所选文件和文件夹的完整 Unix 路径。使用growlnotify,部分咆哮为了演示目的:

在此处输入图片描述

在文件上运行它后产生的咆哮消息:

在此处输入图片描述

该命令显示在 Finder 中文件或文件夹的上下文菜单中。如果适用的命令太多,服务,它们被分组到一个子菜单中服务

在此处输入图片描述


如果您的脚本需要两个都完整文件路径,以及文件名,您可以执行以下操作,首先从完整路径中提取文件名:

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

您可以看到,在 Growl 中,文件名用作标题,而路径用作消息:

在此处输入图片描述


如果您需要查询其他输入,可以执行简短的 AppleScript 来执行此操作。以下是一个完整的 shell 脚本(如上文所述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

在此处输入图片描述

相关内容