Использование find с printf и или - PullRequest
0 голосов
/ 12 октября 2018

Я запутался в использовании find и объединении -printf с -o.Скажем, у меня есть несколько файлов в каталоге, например

$ ls
a1  b1

, и я хочу использовать find с двумя фильтрами.Начиная с AND:

find . -iname "a*" -iname "*1"
./a1

и используя -printf для подсчета :

find . -iname "a*" -iname "*1" -printf '.'
.

Кажется, хорошо.Теперь попробуйте то же самое с -o, чтобы получить ИЛИ двух фильтров:

$ find . -iname "a*" -o -iname "*1"
./b1
./a1
$ find . -iname "a*" -o -iname "*1" -printf '.'
.

Почему бы мне не получить ..?Изменение порядка аргументов не помогает:

$ find . -printf '.' -iname "a*" -o -iname "*1" 
...

РЕДАКТИРОВАТЬ:

$ find . -type f \( -iname "a*" -o -iname "*1" \)
..

дает ожидаемое поведение, см. Принятый ответ для объяснения.

1 Ответ

0 голосов
/ 22 октября 2018

См. Раздел OPERATORS справочной страницы find:

ОПЕРАТОРЫ

Перечислено в порядке убывания приоритета:

( expr )

Forceстаршинство.Так как круглые скобки являются специальными для оболочки, вам обычно нужно их заключать в кавычкиВо многих примерах на этой странице руководства для этой цели используется обратная косая черта: '\(...\)' вместо '(...)'.

[...]

expr1 expr2

Взяты два выражения подрядбыть соединенным с подразумеваемым «и»;expr2 не вычисляется, если expr1 имеет значение false.

[...]

expr1 -o expr2

Или;expr2 не вычисляется, если expr1 имеет значение true.

И затем, выделение мое:

Обратите внимание, что -a, если указано неявно (например, двумя тестами, появляющимися безявный оператор между ними) или явно имеет более высокий приоритет, чем -o. Это означает, что find . -name afile -o -name bfile -print никогда не будет печатать файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...