我正在尝试学习Linux命令行,但我在理解find
命令时遇到了问题。
我想列出包含目录.hg
的所有目录。
列出所有目录:
find -type d
这是我想要执行的测试:
[ -d .hg ]
根据查找手册页
find [-H] [-L] [-P] [path...] [expression]
其中expression包含测试。但是这个:
find -type d [ -d .hg ]
不起作用。
这里的语法是什么?对不起,这是一个基本的问题,但我绝对没有人要问。
答案 0 :(得分:2)
这可以成功:
find . -type d -exec test -e "{}/.hg" ';' -print
所以它查找目录,并在每个目录中检查目录.hg
的存在。它只打印返回true的那些。
您可以找到many examples in ask ubuntu。
$ mkdir t1
$ mkdir -p t2/.hg
$ mkdir -p t3/t4/.hg
$ find . -type d -exec test -e "{}/.hg" ';' -print
./t2
./t3/t4
答案 1 :(得分:2)
我想说最好只找到.hg目录,然后从输出中删除它们。像:
find . -type d -name .hg | sed 's#/.hg$##'
原因很简单 - find .. -exec
将为每个目录启动子shell。另一方面 - 我的解决方案只是使用普通的目录遍历找到.hg文件,然后使用文本处理工具在最后删除过时的.hg。
答案 2 :(得分:2)
100%纯bash溶液:
shopt -s globstar
for i in **/.hg/; do
echo "${i%/.hg/}"
done
或者如果您不介意看到所有尾随的/.hg/
:
shopt -s globstar; printf "%s\n" **/.hg/