`find -type l` соответствует файлу, а `-type l -o -type f` не соответствует, но только с явным `-print`

`find -type l` соответствует файлу, а `-type l -o -type f` не соответствует, но только с явным `-print`

Я использую GNU find.

Я упростил свою проблему до следующего сеанса оболочки:

$ mkdir t
$ cd t
$ touch a 
$ ln -s a b
$ find -type l
./b
$ find -type l -o -type f
./a
./b
$ find -type l -print
./b
$ find -type l -o -type f -print
./a

Может быть, это из-за того, что я очень сонный, но мне непонятны две вещи:

  • Разве нет true OR false == true? Как получается, что добавление -o -type fприводит findк остановке сопоставления ./b, несмотря на -type lсопоставление?
  • В руководстве указано, что -printэто выражение по умолчанию. Так как же получается, что файл печатается, когда он не упоминается, но опускается, когда он упоминается?

Это также происходит при использовании -printf(того, что мне на самом деле нужно); я полагаю, что другие выражения тоже подвержены влиянию.

решение1

В

find -type l -o -type f -print

вы указали действие, поэтому значение по умолчанию больше не применяется. Но -printfздесь обязательно, -type fпотому что «и» имеет более высокий приоритет, чем «или»; вы можете считать это эквивалентом

find \( -type l \) -o \( -type f -print \)

Чтобы обрабатывать ссылки и файлы одинаково, необходимо сгруппировать тесты:

find \( -type l -o -type f \) -print

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