0

我正在尝试学习 Linux 命令行,但在理解find命令时遇到了问题。

我想列出所有包含该目录的目录.hg

这列出了所有目录:

find -type d

这是我要执行的测试:

[ -d .hg ]

根据查找手册页:

find [-H] [-L] [-P] [path...] [expression]

其中表达式包含测试。但是这个:

find -type d [ -d .hg ]

不起作用。

这里的正确语法是什么?很抱歉,这是一个如此初级的问题,但我绝对没有人可以问。

4

3 回答 3

2

这可以使它:

find . -type d  -exec test -e "{}/.hg" ';' -print

因此它会查找目录,并在每个目录中检查 dir 的存在.hg。它只打印返回 true 的那些。

您可以在 ask ubuntu 中找到许多示例

测试

$ mkdir t1
$ mkdir -p t2/.hg
$ mkdir -p t3/t4/.hg
$ find . -type d  -exec test -e "{}/.hg" ';' -print
./t2
./t3/t4
于 2013-06-21T11:57:35.930 回答
2

我会说最好简单地找到 .hg 目录,然后将它们从输出中删除。像:

find . -type d -name .hg | sed 's#/.hg$##'

原因很简单——find .. -exec将为每个目录启动一个子shell。另一方面 - 我的解决方案将使用普通目录遍历找到 .hg 文件,然后使用文本处理工具在最后删除过时的 .hg 。

于 2013-06-21T12:16:01.377 回答
2

100% 纯解决方案:

shopt -s globstar
for i in **/.hg/; do
    echo "${i%/.hg/}"
done

或者如果您不介意看到所有尾随/.hg/

shopt -s globstar; printf "%s\n" **/.hg/
于 2013-06-21T12:25:27.970 回答