![Почему поведение find(1) отличается при явном добавлении -print?](https://rvso.com/image/1457450/%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83%20%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20find(1)%20%D0%BE%D1%82%D0%BB%D0%B8%D1%87%D0%B0%D0%B5%D1%82%D1%81%D1%8F%20%D0%BF%D1%80%D0%B8%20%D1%8F%D0%B2%D0%BD%D0%BE%D0%BC%20%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8%20-print%3F.png)
На странице руководства 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
Я так думаю, во всяком случае :)