![为什么向此 find 命令添加 -prune 会导致打印无关文件?](https://linux22.com/image/91822/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%90%91%E6%AD%A4%20find%20%E5%91%BD%E4%BB%A4%E6%B7%BB%E5%8A%A0%20-prune%20%E4%BC%9A%E5%AF%BC%E8%87%B4%E6%89%93%E5%8D%B0%E6%97%A0%E5%85%B3%E6%96%87%E4%BB%B6%EF%BC%9F.png)
如果我想在整个文件系统中搜索名为 的文件bash
,我可以运行以下命令
% find / -name "bash" 2> /dev/null
在我的系统上生成
/bin/bash
/etc/apparmor.d/abstractions/bash
/usr/share/doc/bash
/usr/share/lintian/overrides/bash
/usr/share/menu/bash
/rofs/bin/bash
/rofs/etc/apparmor.d/abstractions/bash
/rofs/usr/share/doc/bash
/rofs/usr/share/lintian/overrides/bash
/rofs/usr/share/menu/bash
这很好,但我知道系统上有某些目录,该文件肯定在其中不是,因此为了使搜索更加高效,我将命令更新为:
% find / \
-name "proc" -prune -o \
-name "sys" -prune -o \
-name "run" -prune -o \
-name "bash" \
2> /dev/null
现在我收到满屏的无关文件,为什么要这样做find
?
查找版本
% find --version
find (GNU findutils) 4.7.0-git
答案1
因为您尚未指定最终操作,find
所以将此视为您已完成
find / \( -name .. -prune -o -name .... -o -name bash \) -print
“-prune”返回 true,因此它打印出这些目录。这意味着每个被调用的目录sys
,每个被调用的目录proc
等等。如果您有内核源代码,肯定会有很多目录!
例如
/sys
/var/run
/proc
/usr/src/linux-headers-3.16.0-4-amd64/include/config/sys
/usr/src/linux-headers-3.16.0-4-amd64/include/config/keys/debug/proc
/usr/src/linux-headers-3.16.0-4-amd64/include/config/nf/conntrack/proc
/usr/src/linux-headers-3.16.0-4-amd64/include/config/proc
所有这些都被称为sys
或run
或proc
或...
-print
简单的答案是在命令末尾添加一个
% find / -name "proc" -prune -o \
-name "sys" -prune -o \
-name "run" -prune -o \
-name "bash" -print \
2> /dev/null
现在find
只会打印bash
条目
例如
/usr/share/doc/bash
/usr/share/lintian/overrides/bash
/usr/share/menu/bash
/bin/bash