![在 Mac 上使用 find 命令扫描 / 目录时无法排除目录 /System](https://linux22.com/image/191393/%E5%9C%A8%20Mac%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20find%20%E5%91%BD%E4%BB%A4%E6%89%AB%E6%8F%8F%20%2F%20%E7%9B%AE%E5%BD%95%E6%97%B6%E6%97%A0%E6%B3%95%E6%8E%92%E9%99%A4%E7%9B%AE%E5%BD%95%20%2FSystem.png)
我试图扫描整个 Mac 以查找大于 1GB 的文件。我无法阻止该find
命令扫描目录/System
和/System/Volumes
.
find -x / -type f -size +1G
我尝试过prune
、、! -path
但-not -path
似乎没有任何帮助。
答案1
尝试这个:
find -x / -path /System -prune -or -type f -size +1G -print
在我看来,获得正确的布尔逻辑find
是程序中最困难的事情之一 - 如果不使用括号,很容易失去对逻辑的跟踪......并且它根本没有帮助,必须转义括号使它变得丑陋和很难阅读。
简而言之:关于 find 你必须记住的关键一点是每个谓词都是隐式与运算与前面的谓词一起使用,除非您告诉find
使用 OR ( -or
or -o
)。
AND 是-and
or -a
,但由于 AND 是默认值,因此您很少需要显式地使用 AND ,除非您想让它明确清晰,这样当您需要在 X 个月内编辑它并且忘记它是如何工作时更容易理解。例如,以下内容与上面的示例等效:
find -x / -path /System -and -prune -or -type f -and -size +1G -print
他们的评估方式如下:(-path /System -and -prune) -or (-type f -and -size +1G)
因此,上面的命令-path /System
与 和,然后与AND-prune
进行或运算,导致 /System 目录和所有子目录(因此无需显式排除 /System/Volumes)从搜索中排除。-type f
-size +1G
如果需要排除两个或多个目录,请使用括号,需要转义或引用括号以隐藏 bash 中的特殊(即复合命令/子 shell)含义。例如:
find -x / \( -path /System -o -path /somewhere -o -path /else \) -prune -o -type f -size +1G -print
在此示例中,-prune
适用于目录(/System OR /somewhere OR /else)
我希望这能澄清一些事情——我现在有点睡眠不足,不确定我是否解释得很好。
顺便说一句,-x
FreeBSD 的 find 选项是一个很好的增强。使用标准-xdev
谓词使布尔逻辑进一步复杂化。 (不幸的是,GNU find 没有-x
,但这与您无关,因为您在使用 FreeBSD 的 Mac 上运行find
)