Почему поведение 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
Я думаю, в любом случае:)