Как можно понять поведение этого `find -prune`? - PullRequest
4 голосов
/ 24 октября 2019

В соответствии с 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

  1. file1 неsatify -name dir с пропуском.

  2. dir удовлетворяет -name dir с отсечением и dir добавляется в список TODO.

  3. -print дополнительно применяется к dir в списке TODO.

#2

  1. file1 удовлетворяет -name file1, поэтому добавленов список TODO.

  2. аналогично #1 -2

  3. -print дополнительно применяется к dir и file1 in TODO list.

#3

  1. аналогично #2 -1

  2. То же, что #2 -2

  3. -print применяется к file1 в списке TODO.

  4. -print следует дополнительно применять к dir, потому что -prune не запрещает -print. (Но это неверно. ПОЧЕМУ?)

#4

  1. file1 добавлено в список TODO.

  2. аналогично #3 -2

  3. аналогично #3 -3

  4. аналогично #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 (оба выраженияникогда не доволен одновременно)

1 Ответ

2 голосов
/ 25 октября 2019

Как написано в этом комментарии и в этом комментарии , мой вопрос, который обобщен в разделе Дополнение в OP, возник из-за неоднозначности в man-страницеGNU find и POSIX имеет лучшее объяснение. Я обнаружил, что это правда.

POSIX говорит

(Если выражение отсутствует, -print должно использоваться в качестве выражения. В противном случае,) еслиданное выражение не содержит никаких основных цветов -exec, -ok или -print, данное выражение должно быть эффективно заменено на:

( given_expression ) -print

и естественно интерпретировать given_expression - составное выражение, которое состоит из одного или нескольких подвыражений, потому что оно закрыто в скобках. (Если бы это given_expression относилось к одному подвыражению, скобки определенно были бы излишними.)

...