【问题标题】:Hide empty folders recursively, ignoring .DS_Store, etc递归隐藏空文件夹,忽略 .DS_Store 等
【发布时间】:2015-10-08 19:04:09
【问题描述】:

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

这最终将用作 Alfred 工作流程的一部分,允许我在我的默认项目文件夹层次结构中隐藏/显示额外的文件夹。目标是在重新熟悉一个项目时保持理智,但保持文件夹结构到位,以便我可以在项目之间保持一致。

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

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

这在理论上可行,但问题是 Mac OS X 将系统文件添加到我想考虑为空的文件夹中。

隐藏目录时如何忽略 .DS_Store 等文件?

【问题讨论】:

  • 我想出的唯一可能的解决方案是先删除这些文件,但随后您会丢失它们包含的所有设置。

标签: bash terminal directory hidden-files alfred


【解决方案1】:

你可以这样做:

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

其中 $NF

. 
..
.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 " $1 ) }'

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

【讨论】:

  • 哇,太棒了!我遇到的唯一问题是 chflags 无法找到包含空格的文件夹。
  • 这应该可以解决它:find . -type d -exec bash -c "echo -ne '{}\t'; ls -a1 '{}' | egrep -v '^\.(\.?|DS_Store)$' | wc -l" \; | awk -F"\t" '$NF&lt;=0{ system("chflags hidden \"" $1 "\"" ) }'
  • 感谢您的帮助!似乎递归仍然在发生一些事情。如果一个文件夹包含另一个“空”文件夹,则它不会被视为空。
  • 我认为递归是指从当前级别向下隐藏空文件夹,而不是隐藏具有空子文件夹的文件夹。这也应该隐藏带有空子文件夹的文件夹:find . -type d -exec bash -c "echo -ne '{}\t'; ls -al '{}' | tr -s ' ' | cut -d' ' -f1,9-255 | egrep -v '(^.{10}@.*|^(total|.{11}\.(\.?|DS_Store))$)' | wc -l" \; | awk -F"\t" '$NF&lt;=0{ system("chflags hidden \"" $1 "\"") }' 您可能需要运行该命令几次才能使整个结构保持正常...
  • 很抱歉给您带来了困惑。我本质上想隐藏任何不包含文件的文件夹结构。这包括“空”文件夹。我将更新问题以使其更清晰。
猜你喜欢
  • 2011-05-08
  • 2012-08-07
  • 2011-08-16
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 2013-04-23
  • 1970-01-01
相关资源
最近更新 更多