Логика работы find с несколькими условиями и операторами

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Аватара пользователя
lone_wolf
Сообщения: 211

Логика работы find с несколькими условиями и операторами

Сообщение lone_wolf »

Приветствую жителей форума :drinks:
Собственно заинтересовался как с помощью find производить поиск c указанием нескольких имен файла, с наскоку не получилось своими силами сделать. Не долгое гугление дало результат:

Shell

find . -type f \( -name bukkit.yml -o -name spigot.yml \) -printf "%m %u %g %p \n"
Проверил, всё работает. Ну что же настало время разбираться зачем тут скобки, и что значит -о.
Полез в man начал читать и нечего не понял, нет то что -о это логическое ИЛИ (-or) это я понял, но почему используется именно оно а не логическое И (-a или -and) не понял от слова совершенно, по логике вещей должно быть именно логическое И, так как мне нужет и тот и тот файл, и зачем нужны скобки тоже не понял :( (в man говорится что они имеет принудительный приоритет).

Собственно начала экспериментировать, если команда

Shell

find . -type f \( -name bukkit.yml -o -name spigot.yml \) -printf "%m %u %g %p \n"
показывала действительно что я хочу увидеть, 2 файлика и их права, то если поставить логическое И (-a/-and) команда молчит.

Хорошо, попробовал тоже самое без скобок:

Shell

find . -type f -name bukkit.yml -o -name spigot.yml -printf "%m %u %g %p \n"
И в ответ получаю только права на файл spigot.yml, а вот про файл bukkit.yml тишина.
Попробовал поставить логическое И, и в ответ тишина.

Попробовал просто без скобок и без действия -printf

Shell

find . -type f -name bukkit.yml -o -name spigot.yml
И получаю в ответ на выводе эти два файла, с логическим И естественно не работает.

Собственно вопрос в том что я упускаю что с логическим И вообще не работает, а вот с ИЛИ работает без вопросов, и почему с со скобками работает а без нет, и кстати вот в последнем случае вообще не понял почему просто поиск без явного указания действия сработал?
Последний раз редактировалось lone_wolf 22.02.2023 18:09, всего редактировалось 1 раз.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21271
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Логика работы find с несколькими условиями и операторами

Сообщение Bizdelnick »

lone_wolf писал:
22.02.2023 17:49
то что -о это логическое ИЛИ (-or) это я понял, но почему используется именно оно а не логическое И (-a или -and) не понял от слова совершенно
Потому что имя файла не может быть одновременно bukkit.yml и spigot.yml. Нужен файл, имя которого bukkit.yml или spigot.yml.
lone_wolf писал:
22.02.2023 17:49
почему с со скобками работает а без нет, и кстати вот в последнем случае вообще не понял почему просто поиск без явного указания действия сработал?
Без скобок ищется совпадение со всем, что слева от -o, либо со всем, что справа от -o. То есть либо простой файл (-type f), имеющий имя bukkit.yml, либо файл любого типа с именем spigot.yml и для него выводится строка с метаданными. Что здесь неочевидно — это то, что такие параметры, как -printf, -exec и т. д. обрабатываются точно так же, как и проверки (-type, -name и т. п.), и на них точно так же распространяется действие группирующих скобок и логических операторов.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
lone_wolf
Сообщения: 211

Re: Логика работы find с несколькими условиями и операторами

Сообщение lone_wolf »

Bizdelnick Спасибо, теперь стало понятней.
Получается скобки используются для группировки параметров.
Спасибо сказали: