В соответствии с man-страницей GNU find
, по умолчанию используется действие -print
, а
Действиями, запрещающими использование по умолчанию -print
, являются -delete
, -exec
, -execdir
, -ok
, -okdir
, -fls
, -fprint
, -fprintf
, -ls
, -print
и -printf
.
Таким образом, действие -prune
должно продолжатьсяподразумевает -print
действие.
На самом деле, это так.
$ tree .
.
├── dir/
│ └── file2
└── file1
$ find . -name dir #0
./dir
$ find . -name dir -prune #1
./dir #printed as expected
$ find . -name dir -prune -or -name file1 #2
./file1
./dir #printed as expected
Однако иногда -prune
запрещает значение по умолчанию -print
.
$ find . -name dir -prune -or -name file1 -print #3 #last -print is only added to the above example
./file1
$ find . -name dir -prune -or -print #4
.
./file1
Как можноЯ понимаю это противоречие?
Мое понимание :
#1
file1
неsatify -name dir
с пропуском.
dir
удовлетворяет -name dir
с отсечением и dir
добавляется в список TODO.
-print
дополнительно применяется к dir
в списке TODO.
#2
file1
удовлетворяет -name file1
, поэтому добавленов список TODO.
аналогично #1
-2
-print
дополнительно применяется к dir
и file1
in TODO list.
#3
аналогично #2
-1
То же, что #2
-2
-print
применяется к file1
в списке TODO.
-print
следует дополнительно применять к dir
, потому что -prune
не запрещает -print
. (Но это неверно. ПОЧЕМУ?)
#4
file1
добавлено в список TODO.
аналогично #3
-2
аналогично #3
-3
аналогично #3
-4
(На самом деле в TODO нет списка find
. См. этот комментарий и стандарт .)
Дополнение :
Как указано в ответ oguz ismail (удален сейчас), мой вопрос не связан с -prune
. Однако вопрос не решен.
Давайте подумаем о -name A -o -name B -print
. Это разбито на два выражения: -name A
или -name B -print
.
Мое понимание: первое выражение -name A
не имеет действия. Так что -print
следует подразумевать. Другими словами, -name A -o -name B -print
следует интерпретировать как -name A -print -o -name B -print
.
Фактическое поведение: -name A -o -name B -print
является одним составным выражением. В этом составном выражении -print
. Таким образом, никаких дополнительных -print
не должно подразумеваться.
Существует двусмысленность, но я считаю, что моя интерпретация более естественна, поскольку в этом случае каждому файлу удовлетворяется только -name A
или -name B -print
(оба выраженияникогда не доволен одновременно)