OSX 的交互设计我从总体上来说还是满意的。操作系统本就是个互相借鉴的产物,有些操作在 OSX 上比较习惯,有些我则更喜欢 Windows 。比如接下来要说到的这个就是我一直耿耿于怀为什么 Apple 一直不去做好的东西:废纸篓。
说 Apple 没有做好废纸篓其实是有些冤枉的:OSX 的废纸篓可以快速查看,可以拖曳还原,UI 又漂亮。问题在于有一个 Windows 回收站里很容易实现的操作在 OSX 上是不能实现的:选择单个或多个文件彻底删除——而 OSX 上只有可怜的一个按钮叫做“清空废纸篓”。这对于废纸篓里面全是文件但是又急于腾出硬盘空间的人来说简直是苦了命了。解决方法一般有两个:一是先把需要保留的文件全部移到其它目录下去,清空废纸篓,然后把这些文件拖回去;二是用终端到 $HOME 下的 .Trash 目录下去找到需要的东西 rm 掉。这两种方法的便利性先不考虑,至少一点都不 Mac 。
这次我要介绍的当然是很 Mac 的办法。你猜对了,遇到这种事情首先想到的一定是 Automator :
首先我们在弹出的“文稿类型”选择框中选择“服务”:
在 Automator 的主工作界面中,将服务对象设置成“文件或文件夹”,位于“Finder.app”。然后在左侧面板找到“运行 shell 脚本”,将其拖入右侧的工作区(点击图片放大):
在工作区中,先将右上角的“传递输入”设成“作为自变量”,然后主代码框会根据你的选择自动更改成一个含 for 语法的 shell 脚本,在里面将 cat “$f” 的那一行改成 rm -rf “$f” :
如果在“传递输入”中选择的是“stdin”,意味着服务会将选择的文件通过管道作为 shell 命令的输入流 stdin 。管道命令在 *NIX 中是很常用的技巧,但是 rm 在搭配管道命令的时候必须配合 xargs 才能达到目的,这是因为 rm 命令使用的是参数而不是输入流[1][2]。经测试,使用 xargs rm -rf 在废纸篓内部调用服务无效,普通目录有效。有兴趣的同学可以试下。
接下来给我们的“服务”取个名字,比如“彻底删除”,然后储存退出:
现在你可以在废纸篓里面随意选几个文件,右键调用我们的服务了:
后记:
1) 其实当初我选择 stdin 和使用 xargs 无效的时候试过另一种解决方案:首先手工建立一个临时目录 toDelete,服务的第一步将文件移到那个目录,然后调用 rm -rf toDelete/* 把目录清空。这个方案工作的很好,但有一个不足是当清除移动设备上的文件时,由于 .Trash 目录是在移动设备下的,大文件移动到本地硬盘的性能很差,对移动设备的寿命也没什么好处。在这里记录下希望有些借鉴意义。
2) 本文建立的服务其实顺便实现了任意目录下文件彻底删除的功能。OSX 中服务是可以设定快捷键的,所以完全可以实现与 Windows 下 shift+delete 类似的功能。但是我非常不提倡这样做,无数血的教训告诉我们数据是无价的,废纸篓这样的功能设计出来就不应该成为花瓶,所以 shift+delete 是我最痛恨的一个快捷键。不仅如此,我还建议在 Automator 中在 shell 脚本之前加一个确认框(拖入即可,很容易实现),以最大程度避免误操作。
3) OSX 自定义的服务文件保存在 ~/Library/Services 下。如果不需要了可以到那边删除。
[1] 请问一下rm命令和管道结合使用的问题. fedora 中文用户组论坛. http://bbs.fedora-zh.org/showthread.php?1901-…
[2] Xargs用法详解. zhangfn2011的专栏. CSDN. http://blog.csdn.net/zhangfn2011/article/details/6776925
[…] 右键增加“服务->彻底删除“,然后在“系统偏好设置 -> 键盘 ->快捷键 ->服务”,找到“彻底删除”,可以为其添加快捷键。 […]
ox 10.9.4 这么做了后,点彻底删除没有反应。
我这边是可以的,但是会有一会延迟。
[…] 右键增加“服务->彻底删除“,然后在“系统偏好设置 -> 键盘 ->快捷键 ->服务”,找到“彻底删除”,可以为其添加快捷键。如果不用了,也可以删除右键快捷菜单Services->Delete Permanently。 […]