Почему поведение 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

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

Другие вопросы по тегам