如何在finder中使用选定的文件/文件夹执行Shell脚本?


13

我来自Linux,在Nautilus或Dolphin中针对一组文件运行脚本很容易,但是看到OSX并不容易,我感到很惊讶。

最好,我希望能够在finder中按住ctrl键单击,选择我的脚本并弹出一个终端窗口以显示进度或任何用户交互。

Answers:


8

最简单的,内置的方式做,这是刚刚从拖动物品查找到一个终端窗口。当您放置它们时,终端将“键入”其(转义的)路径名。然后,您可以使用Shell的命令行编辑来输入其余命令。或者,如果您正在考虑,可以先键入命令,然后将其拖入项目。

“先拖拽”版本:

  1. 选择一些Finder项并将其拖到显示外壳提示的“ 终端”窗口中。终端将插入(转义的)路径名。
  2. 键入Control+ A(转到行的开头; ⌃A是缺省值,但因shell /配置而异)。
  3. 键入您的命令和一个空格(将在路径名之前插入它)。

“超前思维”版本:

  1. 以任何顺序执行以下两项操作:
    • 在“ 终端”窗口中,键入命令和空格的初始部分(除路径名外的所有内容)。
    • Finder中选择一些项目。
  2. 将所选项目从Finder拖到键入命令的“ 终端”窗口中。
  3. 激活终端窗口,然后按Return

如果您需要更多的自动化解决方案,则可以(如其他答案所示)转向AppleScript或Automator。由于额外的“活动部件”可能会增加解决方案的复杂性,因此您必须权衡上述过程(手动但灵活)的好处与实现一个或多个自动化解决方案的复杂性。

一些自动化的可能性包括:

  • AppleScript小滴应用程序
  • 由内置脚本菜单或其他启动器启动的普通AppleScript程序
    • Finder的选择中获取路径名
  • Automator工作流程,应用程序或Finder插件
  • 可执行.command文件(通常是shell脚本;在Finder中打开以在Terminal中运行它)
    • Finder的选择中获取路径名(通过osascript
  • 一些已经提供您所需功能的第三方工具

7

我认为没有办法直接做到这一点。您可以构建一个“ Automator”应用程序,该应用程序将执行您要查找的某些内容。这显示了Automator堆栈的外观:

在此处输入图片说明

将结果保存为应用程序,然后在查找器中选择文件,右键单击并选择“打开方式”,然后选择您的应用程序。(您可能需要在应用程序列表的底部选择“其他...”。)

您无需使用此方法与脚本进行交互,但是可以循环遍历文件以执行一些Shell脚本。


如果将文件拖放到应用程序图标上,然后放下它们,将更加容易。
kiamlaluno

5

服务处理此类事情的方式。

在应用程序菜单(在这种情况下,“搜索”)有(几乎)总是一个Services菜单选项,这将提供适用于当前的应用服务其当前状态。通常,状态是所选对象的类型(文本,文件/文件夹等)。

可以在“系统偏好设置”面板中启用,禁用和分配键盘快捷键,这些快捷键仅对这三个中的最后一个有意义Keyboard

键盘快捷键

要制作将外壳程序脚本应用于Finder中文件/文件夹的服务,请执行以下操作:

启动并创建一个新Service类型的文档。

新服务

  • 设置服务适用的对象类型(files or folders
  • 设置可以使用该服务的应用程序(
    • 或者,有一个Get Selected Finder Items动作。
  • 添加一个动作 Run Shell Script
  • 决定是否要将输入作为参数或

它看起来应该像这样:

示例shell脚本

~/Library/Services保存时,会自动将其放置在您的文件夹中,这将通过Application -> Services菜单或上下文(单击右键)菜单立即(几乎)使它可用。

测试文件夹

生成的TextEdit文档



2

根据上面的答案,我构建了这个东西

https://github.com/commonpike/DropShell

基本上,是一个applescript应用程序,该应用程序使用放置的文件作为参数来调用位于该应用程序中的shellfile。您可以根据需要修改Shell脚本。



1

在Mac OS X中,首选的脚本语言是Applescript。您可以创建一个droplet(一个脚本,当您将一些文件拖放到其图标上时会执行某些操作),将该脚本(可以另存为应用程序)图标放置在桌面上,然后将您想要传递的文件拖放到桌面上。脚本。

或者,您可以使用文件夹操作。可以将脚本Applescript关联到一个文件夹,该文件夹将在某些文件(或目录)放置在该文件夹上时始终执行。


1

我也一直想这样做,但是与上面的解决方案不同,我想为shell脚本生成带引号的参数。其他方法很好,但是它们有点像在您真正想要的时候建议“只是将命令-v插入终端” pbpaste

我想制作一个可以在脚本中使用的shell函数,该脚本扩展为每个Finder选择的文件参数。我使用鱼壳,这似乎有些起作用:

function selection
    osascript -e "tell application \"Finder\" to set s to the selection as alias list" -e "repeat with f in s" -e "set contents of f to POSIX path of f" -e "end repeat" -e "set AppleScript's text item delimiters to linefeed" -e "s as string"
end

再次使用(同样在鱼壳中)convert-video (selection)

在bash函数中,可能需要在输出中引用该| tr '\n' '\0' | xargs -0 printf "%q" {}osascript命令末尾的内容(不确定)。

(请注意:我在过去2小时内重新学习了有关高级Applescript和Shell脚本的所有知识,到明天将会忘记)


最近尝试在bash中执行此操作,失败了,在这里问到superuser.com/questions/1353966,得到的答案表明:不,不可能:^(Bash你输了,还要在我的Mac上换成鱼壳。注意我确实使用了上面Chris Johnsen提到的“拖动到查找器”的技巧
皮埃尔·休斯顿
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.