使用 Unix 的 find 命令查找与名称匹配但不查找同名子目录的目录

使用 Unix 的 find 命令查找与名称匹配但不查找同名子目录的目录

已编辑:我错误地歪曲了我的问题。下面是一个更准确的例子。

我想递归遍历目标目录内的所有目录,并在找到第一个 .git 目录后停止每次递归调用。

例如,如果我们有这些路径:

/home/code/twitter/.git/
/home/code/twitter/some_file
/home/code/twitter/some_other_file 
/home/code/facebook/.git/
/home/code/facebook/another_file
/home/code/configs/.git/
/home/code/configs/some_module/.git/
/home/code/configs/another_module/.git/
/home/code/some/unknown/depth/until/this/git/dir/.git/
/home/code/some/unknown/depth/until/this/git/dir/some_file

我只想要结果中的这几行:

/home/code/twitter
/home/code/facebook
/home/code/configs
/home/code/some/unknown/depth/until/this/git/dir/

这里对我没有-maxdepth帮助,因为我不知道目标的每个子目录的第一个 .git 目录有多深。

我以为find /home/code -type d -name .git -prune可以做到,但对我来说却行不通。我错过了什么?

答案1

听起来你想要-maxdepth选项。

查找 /home/code -maxdepth 2 -type d -name .git

答案2

这是很棘手的,并且 -maxdepth 和递归技巧在这里没有帮助,但是我会这样做:

find /home/code -type d -name ".git" | grep -v '\.git/'

用英文来说:找到所有名为“.git”的目录,并过滤掉结果列表中包含“.git/”(点 git 斜线)的任何内容。

上述命令行适用于所有 unix 系统,但是,如果你可以断言你的查找将是“GNU find”,那么这也会起作用:

find /home/code -type d -name ".git" ! -path "*/.git/*"

玩得开心。

答案3

查找包含 .git 子目录的所有目录:

find /home/code -type d -name .git -exec dirname {} \;

相关内容