Почему поведение find(1) отличается при явном добавлении -print?

Почему поведение find(1) отличается при явном добавлении -print?

На странице руководства find(1)написано:

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

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

$ 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

О, я думаю, я уже сам во всем разобрался...

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

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

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

... и:

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

Я так думаю, во всяком случае :)

Связанный контент