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


3

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

  • 完整的文件路径
  • 文件名

如何使用Automator向Finder添加上下文菜单条目以使用选定的文件路径和文件名作为参数运行shell脚本?

Answers:


7

选择在Automator中创建一个服务,该服务仅在Finder中接收选定的文件和文件夹作为输入。添加“ 运行Shell脚本”操作并将输入作为参数传递

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

在此输入图像描述

在文件上运行它的Growl消息:

在此输入图像描述

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

在此输入图像描述


如果你的脚本需要两个完整的文件路径和文件名,你可以不喜欢下面,首先从完整路径解压文件名:

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

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

在此输入图像描述


如果您需要查询其他输入,可以执行一个简短的AppleScript来执行此操作。以下是growlnotify查询输入的完整shell脚本(如上所述),并将所选文件重命名为该新名称。我没有包含错误处理等,例如,在新文件名中添加冒号和斜杠可能会破坏脚本。

    # 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以下方式公布的示例重命名操作的屏幕截

在此输入图像描述


它像魔术一样工作。谢谢!!!另外,我使用growlnotifier来显示操作的结果。一个问题,服务存储在哪里?它没有提示某个位置。它不在〜/ Library
Milen

@Milen ~/Library/Services,你可以随时Command+Click在文件名中(在这种情况下是Automator中的服务)来显示弹出菜单中的完整路径。
Daniel Beck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.