bash - 当使用 '-print' 时,从 'find' 命令中遗漏 '-prune'

标签 bash find

我一直无法完全理解 find 命令的 -prune 操作。但实际上,至少我的一些误解源于省略“-print”表达式的效果。

来自“查找”手册页..

“如果表达式不包含除-prune 之外的任何操作,则对表达式为真的所有文件执行-print。”

.. 我一直(多年来)认为这意味着我可以省略“-print”。

但是,如以下示例所示,使用“-print”和省略“-print”之间区别,至少在出现“-prune”表达式时是这样。

首先,我的工作目录下有以下8个目录..

aqua/
aqua/blue/
blue/
blue/orange/
blue/red/
cyan/blue/
green/
green/yellow/

这8个目录下共有10个文件..

aqua/blue/config.txt
aqua/config.txt
blue/config.txt
blue/orange/config.txt
blue/red/config.txt
cyan/blue/config.txt
green/config.txt
green/test.log
green/yellow/config.txt
green/yellow/test.log

我的目标是使用“查找”来显示所有没有“蓝色”作为文件路径一部分的常规文件。有五个文件符合此要求。

这按预期工作..

% find . -path '*blue*' -prune -o -type f -print
./green/test.log
./green/yellow/config.txt
./green/yellow/test.log
./green/config.txt
./aqua/config.txt

但是当我省略“-print”时,它不仅会返回五个所需的文件,还会返回路径名包含“blue”的任何目录..

% find . -path '*blue*' -prune -o -type f
./green/test.log
./green/yellow/config.txt
./green/yellow/test.log
./green/config.txt
./cyan/blue
./blue
./aqua/blue
./aqua/config.txt

那么为什么会显示三个“蓝色”目录?

这可能很重要,因为我经常尝试删除包含超过 50,000 个文件的目录结构。当处理该路径时,我的查找命令,尤其是当我对每个文件执行“-exec grep”时,可能会花费大量时间来处理我完全不感兴趣的文件。我需要确信 find 不会进入修剪后的结构。

最佳答案

隐式 -print 应用于整个表达式,而不仅仅是它的最后一部分。

% find . \( -path '*blue*' -prune -o -type f \) -print
./green/test.log
./green/yellow/config.txt
./green/yellow/test.log
./green/config.txt
./cyan/blue
./blue
./aqua/blue
./aqua/config.txt

它不会下降到修剪后的目录,但会打印出顶层。

稍作修改:

$ find . ! \( -path '*blue*' -prune \) -type f
./green/test.log
./green/yellow/config.txt
./green/yellow/test.log
./green/config.txt
./aqua/config.txt

(使用隐式 -a)将导致在使用和不使用 -print 时具有相同的行为。

关于bash - 当使用 '-print' 时,从 'find' 命令中遗漏 '-prune',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43263043/

相关文章:

linux - 无法在主目录 : permission denied (Linux Lubuntu) 中使用 mkdir

linux - 如何在 shell 中重复破折号(连字符)

python - 在结构化数组中查找 header 名称的一部分的 header 索引

arrays - 测试数组是否在 lisp 中的列表中

excel - VBA .Findnext 卡在循环上

bash - 搜索并替换为 sed 不起作用

php - Bash 脚本将输出文件截断为 4096 字节

regex - grep 和替换只能工作一半

bash - 在 Unix 中使用 shell 脚本删除超过 10 天的文件

excel - 如何在 VBA 中自动化我的手动选择过程