Почему поведение find(1) отличается при явном добавлении -print?
Справочная страница для find(1) говорит:
Если выражение не содержит никаких действий, кроме
-prune,
Однако между этими двумя выражениями, похоже, есть разница:
$ 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
Я думаю, в любом случае:)