查找不包含目录的目录?

查找不包含目录的目录?

我正在尝试弄清楚如何使用 linux“find”命令(或可以完成该任务的另一个命令)来返回不包含特定名称目录的文件路径/目录列表。

~/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)。有没有什么办法可以让 find 输出这样的列表?

谢谢!

答案1

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

答案2

我不知道如何使用 find,但是这个有效:

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

答案3

为什么不使用 grep?

編輯:

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

这将列出所有目录,grep 将从标准输入读取,然后对字符串“bar”进行逆匹配

答案4

如果您只想匹配那些精确的目录而不是 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/'

相关内容