Intereting Posts
сценарий оболочки, чтобы присоединиться к 2 файлам на основе 2 столбцов, и если совпадение найдено, напишите несколько полей Значение обратной косой черты Как предотвратить выполнение заданий cron в определенные моменты времени в Debian? («игровой» / «режим производительности») Есть ли способ создать ссылку, которая действует как ярлык? Имеет ли исходный сценарий bash неправильные значения для $ BASH_SOURCE? Как создать моментальный снимок в btrfs, а затем откат к нему после некоторой работы? Linux – сценарий оболочки и цветной текст В чем разница между «нахождением» и «до» в vim? Обратное подключение к серверу SSH Анализ файлов CSV для добавления пользователей Контекстное переключение и загрузка Средняя высокая после обновления сервера Сколько секций можно создать в объектном файле? Дезактивация сенсорной панели одним нажатием клавиши Разрешение взаимодействия веб-сервера в брандмауэре Linux уклоняющийся модуль в ошибке apache: «Невозможно найти структуру модуля API` evasive24_module »

find: Что значит «-a» иметь более высокий приоритет, чем «-o»?

Страница man для поиска gnu:

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

Я предполагаю, что приведенное выше выражение эквивалентно:

 find . -name afile -o -name bfile -a -print 

Мой вопрос: как это выражение работает? и почему afile никогда не будет напечатан?

Операторы -and / -a являются логическим оператором AND . Их не нужно указывать, поскольку они подразумеваются сопоставлением двух выражений.

И да, он не будет печатать afile пока вы используете find . -name afile -o -name bfile -a -print find . -name afile -o -name bfile -a -print поскольку оператор find . -name afile -o -name bfile -a -print имеет более высокий приоритет, чем оператор OR -or / -o . Если вы хотите, чтобы afile был напечатан, у вас есть два варианта:

Первый вариант:

Как отметил @malo, запустив find . \( -name afile -o -name bfile \) -a -print find . \( -name afile -o -name bfile \) -a -print вы можете напечатать afile так как скобки имеют наивысший приоритет в командах «Найти» как в версиях GNU, так и в BSD.

Второй вариант:

Не передавая опцию -print . Так оно и будет find . -name afile -o -name bfile find . -name afile -o -name bfile и причина в том, что нет ничего с более высоким приоритетом, чем -o .

Вы должны использовать круглые скобки, поскольку они имеют более высокий приоритет, чем -a :

 find . \( -name afile -o -name bfile \) -a -print