递归隐藏空文件夹,忽略.DS_Store,等等

Hide empty folders recursively, ignoring .DS_Store, etc

我正在尝试编写一个 bash 脚本来在当前目录中递归地隐藏空文件夹。

这最终将用作 Alfred 工作流程的一部分,允许我在我的默认项目文件夹层次结构中 hide/show 额外的文件夹。目标是在重新熟悉项目时保持理智,但保持文件夹结构不变,这样我就可以在项目之间保持一致。

我一直在试验这个终端命令

find . -empty -type d -exec chflags hidden {} +

这在理论上可行,但问题是 Mac OS X 将系统文件添加到出于我的目的我认为是空的文件夹。

如何在隐藏目录时忽略像.DS_Store这样的文件?

你可以这样做:

find . -type d -exec bash -c "echo -ne '{}\t'; ls -a1 '{}' | wc -l" \; |   awk -F"\t" '$NF<=3{ system("chflags hidden "  ) }'

其中 $NF<=3 将转换为隐藏其中包含 3 个或更少项目的所有文件夹,这通常是:

. 
..
.DS_Store

你当然可以用更复杂的东西替换那个部分,但你应该明白这个想法。

或者您可以使用 grep 精确搜索以删除特定文件,例如

find . -type d -exec bash -c "echo -ne '{}\t'; ls -a1 '{}' | egrep -v  '^\.(\.?|DS_Store)$' | wc -l" \; |   awk -F"\t" '$NF<=0{ system("chflags hidden "  ) }'

仅当 ls returns 只有一个或多个 (./../.DS_Store) 时才会隐藏文件夹,如上述条件中所定义。