Shell 如何从“查找”中排除此/current/dot文件夹;d类“;

Shell 如何从“查找”中排除此/current/dot文件夹;d类“;,shell,directory,find,Shell,Directory,Find,可用于查找某个起点以下的所有目录。但它也会返回当前目录(),这可能是不需要的。如何排除它?不仅可以通过-maxdepth参数控制find的递归深度,还可以使用相应的-mindepth参数从“top”开始限制深度。因此,我们真正需要的是: find . -type d : 对于这种特殊情况(),高尔夫球比mindepth解决方案(24对26个字符)更好,尽管由于的原因,这可能稍难键入 要排除其他目录,这将不太好,需要一个干燥度变量: find . ! -path . -type d 我的决策树

可用于查找某个起点以下的所有目录。但它也会返回当前目录(
),这可能是不需要的。如何排除它?

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

find . -type d
:

对于这种特殊情况(
),高尔夫球比
mindepth
解决方案(24对26个字符)更好,尽管由于
的原因,这可能稍难键入

要排除其他目录,这将不太好,需要一个干燥度变量:

find . ! -path . -type d
我的决策树在
之间
-mindepth

  • 剧本?使用
    可移植性
  • GNU互动会议?
    • 是否排除
      ?掷硬币
    • 排除长名称
?使用
-mindepth
当我不介意忽略一级点文件时,我使用
find./*
*
glob在bash中默认与这些文件不匹配-请参阅shopt内置项中的“dotglob”选项:)

eclipsetmp#find。 . /屏幕 ./screen/.testfile2 ./.X11 unix ./.ICE unix /tmux-0 ./tmux-0/默认值 eclipsetmp#find/* /屏幕 ./screen/.testfile2 /tmux-0 ./tmux-0/默认值
嗯,还有一个简单的解决方法(解决方案在windows git bash上对我不起作用)

查找*-类型d

这可能不是很有效,但能完成任务,这是我们有时需要的


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

适用于GNU find,但不幸的是,它是对的GNU扩展,甚至LSB也使用POSIX外壳实用程序(不是GNU扩展的实用程序),这对我来说很有效。即:
find-mindepth 1-maxdepth 1-typed…
如果需要排除多个路径,只需执行
find/path/-路径“/路径/第一”-path“/path/second”
这是唯一的方法吗?@VincentDeSmet您想只排除这些路径,还是实际上不递归到它们中?如果只是路径,您可以使用
find/-regex'/\(a\| b\)/.'
或者更简单地说,管道通过grep。要避免递归,上述操作将非常低效,您应该使用
-prune
:我的问题如下:我想递归删除目录中除1个子目录之外的所有内容。我使用
find
grep
排除目录,但父目录仍然存在,导致所有内容都被删除。@VincentDeSmet我看不到使用
find
的直接解决方案,您需要检查前缀:但是Bash for循环可以处理它:-)为了安全起见,您可能希望转义感叹号字符(
\!
)。我的机器的
人工查找
中的所有示例都已转义,因此看起来这可能是个好主意™. 编辑-刚刚注意到它甚至明确地说:
!如果expr为false,则expr为True。此字符通常还需要保护,以防shell解释。
FYI。不要在
-exec
选项中使用此技巧。例如,如果您尝试
find dir/*-type d-exec rmdir{},您将看到错误。您弄错了,或者可能被误导了。这个命令会很有效的。如果您看到错误,它们将来自
rmdir
,并且很可能告诉您目录不是空的,因为
find
将对目录进行深度优先搜索,在其子目录之前显示父目录。注意:“忽略一级点文件”也意味着排除所有隐藏的文件/目录。在此之前使用shopt-s dotlob,您将匹配每个点文件,但当前文件夹的点文件除外。在bash版本3.2和5.0上进行了测试。
find . ! -path . -type d
D="long_name"
find "$D" ! -path "$D" -type d
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