已编辑:我错误地歪曲了我的问题。下面是一个更准确的例子。
我想递归遍历目标目录内的所有目录,并在找到第一个 .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 {} \;