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
不会进入prune
d 目录。