Я использую 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