find . -type d
可以用来查找某个起始点下的所有目录。但它也会返回当前目录 (.
),这可能是不想要的。如何排除它?
-maxdepth
参数可以控制find
函数的递归深度,而相应的-mindepth
参数也可以限制从“顶部”开始的深度。因此,实际需要的是:
find . -mindepth 1 -type d
find . ! -path . -type d
对于这种情况( .
),高尔夫球比 mindepth
解决方案更好(24比26个字符),尽管由于!
的缘故,可能会稍微难打一些。D="long_name"
find "$D" ! -path "$D" -type d
在!
和-mindepth
之间,我的决策树:
!
以保证可移植性。.
?掷硬币。long_name
?使用-mindepth
。find /path/ ! -path "/path/first" ! -path "/path/second"
,这是唯一的方法吗? - Vincent De Smetfind
和 grep
来排除该目录,但父目录仍然存在,导致最终删除了所有内容。 - Vincent De Smetfind
的直接解决方案,你需要检查前缀:https://dev59.com/emMl5IYBdhLWcg3w_rKD 但是 Bash for 循环可以处理它 :-) - Ciro Santilli OurBigBook.com\!
)以保险起见。我机器上的man find
中的所有示例都已经转义了,因此这似乎很可能是个好主意™。编辑-刚刚注意到它甚至明确表示:“如果表达式为false,则! expr为True。通常还需要保护此字符免受shell解释。” - Adrian Günter当我不介意忽略一级点文件(在bash中,通过 *
无法匹配这些文件 - 可以参考shopt内置的“dotglob”选项:https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html),我会使用 find ./* <...>
。
eclipse tmp # find . . ./screen ./screen/.testfile2 ./.X11-unix ./.ICE-unix ./tmux-0 ./tmux-0/default
eclipse tmp # find ./* ./screen ./screen/.testfile2 ./tmux-0 ./tmux-0/default
find dir/* -type d -exec rmdir {} \;
,将会出现错误。 - plhnrmdir
命令,并且告诉你这些目录不是空的,因为 find
命令会进行深度优先搜索,先显示父目录再显示子目录。 - Milos Ivanovic好的,还有一个简单的解决方法(对于我来说,解决方案在Windows git bash上无法正常工作)
find * -type d
它可能不是非常高效,但可以完成工作,有时我们需要它。
[编辑] :如@AlexanderMills所评论的那样,它将不会显示根位置的隐藏目录(例如./.hidden
),但它将显示隐藏的子目录(例如./folder/.hiddenSub
)。[在Windows上使用git bash测试过]
find . -type d | sed -r '/^\.$/d'
find . -mindepth 1 -maxdepth 1 -type d ...
- racl101