Toggle Show/Hide Flags for each File/Folder in Mac OS X

Abstract: Using Automator to toggle hidden flags for selected Files/Folder using Bash

Mac 将基于bash的shell 脚本和automator结合,给日常任务之自动化带来无数可能。
下面我们介绍一种在automator中通过bash对选定文件进行显示/隐藏转换的自动服务。
本文属原创,转载请注明。
首先打开automator,创建一个service项目:

service可以使用当前选定的文本,文档,文件夹以及其他特异性目标作为输入,进行上下文关联服务。我们这里介绍的“显示,隐藏”转换就是基于”文档/文件夹“的。如下图,选择files or folders作为selected source:

并将服务范围限制在finder中。

将run shell script 拖入workflow中,输入以下代码:

S=`ls -Ol "$@"`
echo "$S"
if [[ "$S" == *hidden* ]]
then
  chflags nohidden "$@"
  echo "1"
else
  chflags hidden "$@"
  echo "2"
fi
如下图所示:

保存,命名为:toggle hidden flag,即成。现在,随意选中一个文件或文件夹,再按右键,你都能看见我们创建的服务了:

点击toggle hidden flag,重新打开finder,你就能发现选中的文件/文件夹隐藏或者重新显示了。
---进阶-------
下面我们来解释下上面的bash代码:
在shell script的automator中,$@代表选定的文件/文件夹目录。此变量的调用使得基于上下文的服务成为可能。ls -Ol filename 是显示文件熟悉的bash代码,用于读取文件的各项属性。 S=`bash command` 将bash 语句产生的返回值输入变量S中。 这个返回值含有此指定文件的隐藏标记信息。
S=`ls -Ol "$@"`
通过echo我们能看到S中都获取了什么信息。
echo "$S"
下面是简单的if 语句。如果文件属性中含有hidden 标记,说明已被隐藏,我们将它的标记改作“不隐藏”。反之就是未被隐藏,将其标记改作“隐藏”。这就达到了转换的目的。
if [[ "$S" == *hidden* ]]
then
  chflags nohidden "$@"
  echo "1"
else
  chflags hidden "$@"
  echo "2"
fi
最后,还可以加入killall Finder 强迫finder重启,使改动立即见效。隐藏后的文件将以半透明的形式在finder中显示(如果系统显示隐藏文件)。
这样,我们的教程就完毕了,enjoy!