我想查找当前文件夹中的所有目录和子目录,不包括隐藏的目录和子目录(或属于隐藏的目录和子目录)。以下内容不起作用:
find . -type d -name "[!.]*"
因为我认为它只会避免空的隐藏文件夹。像这样的东西是匹配的
./.cache/totem
答案1
我假设您将以点开头的目录归类为“隐藏”。为了避免进入此类目录,您应该使用-prune
.
find . -mindepth 1 -type d \( -name '.*' -prune -o -print \)
这从当前目录开始(我们可以*
在此处指定,但前提是您的通配符未设置为包含点文件/目录 - 例如bash
's dotglob
)。然后它仅匹配目录,但不考虑.
其自身。括号中的部分告诉我们find
,如果名称匹配,.*
那么它将被修剪,这样它或其后代都不会被进一步考虑;否则打印其名称。
如果您没有(非 POSIX)-mindepth
选项,您可以使用此替代方案。可以说这比我建议的原始解决方案更好,但我将把两者都留在答案中
find . -type d \( -name '.?*' -prune -o -print \)
答案2
和zsh
:
print -rC1 -- **/*(N/)
(zsh globs 默认跳过隐藏文件)。
或者对这些目录做任何事情:
for dir (**/*(N/)) anything with $dir
或者,如果anything
可以一次获取多个文件,则使用 GNUxargs
或兼容版本:
xargs -r0a <(print -rNC1 -- **/*(N/)) anything with
POSIXly:
LC_ALL=C find . -name '.?*' -prune -o -type d -print
LC_ALL=C
是必需的,否则它将无法跳过名称包含在用户区域设置中不形成有效字符的字节序列的隐藏目录。另请参阅谓词的顺序如何确保我们避免对-type d
名称lstat()
以.
.
该命令还输出.
(当前工作目录),如果您不需要,请在! -name .
前面添加一个或将其更改为:-type
LC_ALL=C find . ! -name . \( -name '.*' -prune -o -type d -print \)
对文件执行任何操作,替换-print
为-exec anything with {} ';'
或-exec anything with {} +
ifanything
可以一次获取多个文件。
答案3
另一种选择是开源工具 Fd:
默认情况下隐藏的项目被排除,所以你可以简单地执行以下操作:
fd -t d
如果您想取消隐藏项目,那么您可以使用以下一个或两个:
-H, --hidden Search hidden files and directories
-I, --no-ignore Do not respect .(git|fd)ignore files
答案4
只需使用:
find . ! -path '*/.*' -type d