查找不包含目录的目录?

我试图找出如何使用Linux的“查找”命令(或另一个将完成工作的命令)返回不包含某个特定名称的目录的文件path/目录列表。

~/web/domain1.com/public_html/bar ~/web/domain2.com/public_html/ ~/web/domain3.com/public_html/bar ~/web/domain4.com/public_html/ 

我想要所有不包含名为“bar”(domain2.com和domain4.com)目录的path。 任何想法如何find输出这样的列表?

谢谢!

 find ~ -type d '!' -exec test -d '{}/bar' ';' -print 

…但这可能不是你想要的; 对于你给的例子目录,它会输出:

 /path/to/home /path/to/home/web /path/to/home/web/domain1.com /path/to/home/web/domain1.com/public_html/bar /path/to/home/web/domain2.com /path/to/home/web/domain2.com/public_html /path/to/home/web/domain3.com /path/to/home/web/domain3.com/public_html/bar /path/to/home/web/domain4.com /path/to/home/web/domain4.com/public_html 

即列出每个不包含“bar”子目录的目录,甚至包括“bar”目录本身(除非它们包含自己的bar子目录…)。 你可能想添加一个额外的限制,比如只列出一定深度的目录:

 find ~ -type d -depth 3 '!' -exec test -d '{}/bar' ';' -print 

或者用某个名字:

 find ~ -type d -name public_html '!' -exec test -d '{}/bar' ';' -print 

…这两个打印:

 /path/to/home/web/domain2.com/public_html /path/to/home/web/domain4.com/public_html 

我不知道如何使用查找,但是这个工作:

 justin@media:/tmp/sf$ for x in *;do [ -e $x/public_html/bar ] || echo $x;done domain2.com domain4.com 

为什么不使用grep?

编辑:

find . -type d | grep -v "bar"

这将列出所有目录,grep将从标准input中读取,然后对string“bar”进行逆匹配

如果你只想匹配那些确切的目录,而不是任何酒吧的实例/那么像这样的命令将工作。

 find . \! -wholename '*/web/domain1.com/public_html/bar/*' \ \! -wholename '*/web/domain1.com/public_html/bar/' \ \! -wholename '*/web/domain3.com/public_html/bar/*' \ \! -wholename '*/web/domain3.com/public_html/bar/' 

如果你想忽略bar /目录,那么你可能会想要这样的东西。

 find . \! -wholename '*/bar/*' \! -wholename '*/bar/'