关于查找的困惑-打印和修剪选项(unix)

关于查找的困惑-打印和修剪选项(unix)
compa> find . -type d
.
./2015_08_30
./2015_08_25
./2015_08_27
./2015_08_31
./2015_08_24
./2015_08_26


compa> find . -type d -print
.
./2015_08_30
./2015_08_25
./2015_08_27
./2015_08_31
./2015_08_24
./2015_08_26

q1) 我看不出有无 -print 有什么区别。那么我们为什么要使用 -print 呢?

================= 接下来我希望看到要排除的文件夹 2015_08_31。

compa> find . -name "2015_08_31"
./2015_08_31
compa> find . -name "2015_08_31" -prune
./2015_08_31

只有当我在 prune 后面加上 -o -print 时,它才会起作用

find . -name "2015_08_31" -prune -o -print

q2) 为什么? -o 实际上是什么? 我相信它是一个“或”?

再次添加 -o -name,再次改变一切。

compa> find . -name "2015_08_31" -prune -o -name "2015_08_30"
./2015_08_30
./2015_08_31

q3) 当我指定修剪“2015_08_31”时,为什么显示 08_30 和 08_31?

答案1

默认操作find是打印,这就是为什么在初始示例中,无论有没有打印命令,您都看不到任何区别。

我必须承认我从未使用过-prune,但在阅读手册页时,它看起来并没有像你想象的那样。

-prune 真;如果文件是目录,则不要进入其中。

这意味着当找到匹配项时(在本例中为“2015_08_31”),它将find不会进入目录继续查找文件。由于顶级目录匹配,因此它find不需要进入该目录,因此它仍将对其执行操作。

所有后续示例似乎都源于对什么-prune起作用或如何find实际起作用的误解。

如果你find不想打印该目录,那么尝试

find . -type d ! -name "2015_08_31"

在该命令中,find将打印出 . 下除“2015_08_31”之外的所有目录的名称。但是,该命令将打印出“2015_08_31”下的所有子目录。

如果你希望 find 不显示与该目录有关的任何内容,那么你可以尝试

find . -type d ! -regex "./2015_08_31.*"

答案2

q1) 我看不出有无 -print 有什么区别。那么我们为什么要使用 -print 呢?

-print是未指定其他操作时的默认操作。从手册页中:

   If the expression contains no actions other than -prune, -print is per‐
   formed on all files for which the expression is true.

q2) 为什么? -o 实际上是什么? 我相信它是一个“或”?

从手册页中:

   expr1 -o expr2
          Or; expr2 is not evaluated if expr1 is true.

q3) 当我指定修剪“2015_08_31”时,为什么显示 08_30 和 08_31?

-prune操作将停止find进入这些目录,但不会将它们排除在输出之外。考虑以下文件结构:

.
./2015_08_31
./2015_08_30
./2015_08_30/test_dir
./2015_08_30/test_dir/test_file_1
./2015_08_30/test_dir/test_file_3
./2015_08_30/test_dir/test_file_2

跑步:

find . -name "2015_08_31" -prune -o -name "2015_08_30"

将会呈现:

./2015_08_31
./2015_08_30

也就是说,find不会进入pruned 目录。

相关内容