2

Справочная страница для find(1) гласит:

Если выражение не содержит никаких действий, кроме -prune , -print выполняется для всех файлов, для которых это выражение имеет значение true.

Однако между этими двумя выражениями, похоже, есть разница:

$ find . -path '*fo*' -prune -o -type f -print
./bar/xzyzzy
$ find . -path '*fo*' -prune -o -type f
./foo
./bar/xzyzzy

Почему ./foo включен в вывод последнего?

Я создал пример структуры дерева каталогов для выше:

$ cd $(mktemp -d)
$ mkdir foo
$ mkdir bar
$ touch foo/quux
$ touch bar/xzyzzy

Вывод команды find --version для меня:

find (GNU findutils) 4.4.2`

1 ответ1

2

О, я думаю, я решил это сам ...

В первом случае -print выполняется только тогда, когда первое условие (-path '*fo*') не соответствует действительности из-за поведения -o при коротком замыкании.

Однако во втором случае неявный -print выполняется, когда все выражение истинно, - это будет случай, когда -path '*fo*' - true или -type f - true. Другими словами, две команды в моем вопросе эквивалентны:

$ find . \( -path '*fo*' -prune \) -o \( -type f -print \)
./bar/xzyzzy

... а также:

$ find . \( -path '*fo*' -prune -o -type f \) -print
./foo
./bar/xzyzzy

Я думаю, в любом случае :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .