如何从查找“type d”中排除此/当前/点文件夹

Posted

技术标签:

【中文标题】如何从查找“type d”中排除此/当前/点文件夹【英文标题】:How to exclude this / current / dot folder from find "type d" 【发布时间】:2012-11-11 13:52:08 【问题描述】:
find . -type d

可用于查找某个起点以下的所有目录。但它也会返回当前目录 (.),这可能是不受欢迎的。怎么排除?

【问题讨论】:

【参考方案1】:

不仅find的递归深度可以通过-maxdepth参数控制,深度也可以使用对应的-mindepth参数从“top”开始限制。所以真正需要的是:

find . -mindepth 1 -type d

【讨论】:

适用于 GNU find,但不幸的是它是 POSIX 7 find 的 gnu 扩展,甚至 LSB 也使用 POSIX shell 实用程序(不是 GNU 扩展的) 这对我有用。即:find . -mindepth 1 -maxdepth 1 -type d ...【参考方案2】:

POSIX 7 solution:

find . ! -path . -type d

对于这种特殊情况 (.),打高尔夫球比 mindepth 解决方案(24 对 26 个字符)更好,尽管由于 !,这可能稍微难以输入。

要排除其他目录,这会打得不太好,并且需要一个 DRYness 变量:

D="long_name"
find "$D" ! -path "$D" -type d

我在!-mindepth 之间的决策树:

脚本?使用! 实现可移植性。 GNU 上的交互式会话? 排除.?扔硬币。 排除long_name?使用-mindepth

【讨论】:

如果您需要排除多个路径,只需执行find /path/ ! -path "/path/first" ! -path "/path/second" 这是唯一的方法吗? @VincentDeSmet 你想排除那些路径,还是实际上不递归到它们?如果只是路径,您可以使用 find / ! -regex '/\(a\|b\)/.*' 或更简单地,通过 grep 管道。为了不递归,上面的效率很低,你应该使用-prune:***.com/questions/1489277/… 我的问题如下:我想递归删除目录中除 1 个子目录之外的所有内容。我使用findgrep 来排除目录,但父目录仍然存在,导致所有内容都被删除。 @VincentDeSmet 我没有看到find 的直接解决方案,您需要检查前缀:***.com/questions/17959317/… 但是 Bash for 循环可以处理它:-) 为了安全起见,您可能想避开感叹号字符 (\!)。我机器的man find 中的所有示例都已将其转义,因此看起来它可能是一个好主意™。编辑——刚刚注意到它甚至明确表示:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.【参考方案3】:

当我不介意忽略第一级点文件时,我使用find ./* <...>(默认情况下,* glob 在 bash 中与这些不匹配 - 请参阅内置 shopt 中的“dotglob”选项:https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html) .

eclipse tmp # 查找 . . 。/屏幕 ./screen/.testfile2 ./.X11-unix ./.ICE-unix ./tmux-0 ./tmux-0/默认 eclipse tmp # 查找 ./* 。/屏幕 ./screen/.testfile2 ./tmux-0 ./tmux-0/默认

【讨论】:

仅供参考。不要将此技巧与-execoption 一起使用。例如,如果您尝试find dir/* -type d -exec rmdir \;,您将看到错误。 你错了,或者可能是误会。该命令将正常工作。如果您看到错误,它们将来自rmdir,并且很可能会告诉您目录不是空的,因为find 将对目录进行深度优先搜索,将父母显示在他们的孩子之前。跨度> 注意:“忽略一级点文件”也意味着排除所有隐藏文件/目录。【参考方案4】:

好吧,还有一个简单的解决方法(该解决方案在 windows git bash 上对我不起作用)

find * -type d

它的性能可能不是很好,但可以完成工作,这是我们有时需要的。

[编辑]:正如@AlexanderMills 评论的那样,它不会在根位置显示隐藏目录(例如./.hidden),但它会显示隐藏的子目录(例如./folder/.hiddenSub)。 [在 Windows 上使用 git bash 测试]

【讨论】:

在此之前使用 shopt -s dotglob,您将匹配除当前文件夹之外的每个点文件。在 bash 版本 3.2 和 5.0 上测试。

以上是关于如何从查找“type d”中排除此/当前/点文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如何在IntelliJ中的路径搜索中查找此路径的任何位置排除node_modules

用于从地理点列表中查找最近位置对的 Python 脚本

如何从 .htaccess 中排除子文件夹

如何从 gradle 编译中排除 kotlin 文件

如何从 git grep 搜索中排除某些目录/文件

rm排除指定文件或指定文件夹下文件