混淆find - print和prune选项(unix)


0
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

只有当我在剪枝后放一个-o -print,它才有效

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

q2)为什么?什么是实际的 - 或?我相信这是“或”?

再次添加-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?

Answers:


0

默认操作 find 是打印,这就是为什么在初始示例中使用或不使用print命令时看不到任何差异的原因。

我不得不承认我从未使用过 -prune 但在阅读手册页时,看起来它似乎并没有像你认为的那样做。

-prune True;如果文件是目录,请不要进入该目录。

这意味着当找到匹配时,在这种情况下在“2015_08_31”上,然后 find 不会进入目录继续查找文件。由于顶级目录匹配,它 find 不需要进入它,然后它仍将采取行动。

所有后续的例子似乎源于对这一点的误解 -prune 是,或如何 find 实际上有效。

如果你想 find 只是不打印该目录,然后尝试

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

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

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

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

0

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)为什么?什么是实际的 - 或?我相信这是“或”?

从手册页:

   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 没有下降 prune d目录。


那时-o有一种含糊不清的含义。要么;如果expr1为true,则不计算expr2。如果expr1为true,即-name“2015_08_31”,那么为什么显示expr2“2015_08_30”?
Noob
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.