我正在尝试弄清楚如何使用 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/'