如何从查找“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 个子目录之外的所有内容。我使用find
和grep
来排除目录,但父目录仍然存在,导致所有内容都被删除。
@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) .
【讨论】:
仅供参考。不要将此技巧与-exec
option 一起使用。例如,如果您尝试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”中排除此/当前/点文件夹的主要内容,如果未能解决你的问题,请参考以下文章