Как совместить условия 2-name в find?

94

Я хотел бы искать файлы, которые не соответствуют 2 -nameусловиям. Я могу сделать это так:

find /media/d/ -type f -size +50M ! -name "*deb" ! -name "*vmdk"

и это даст правильный результат, но могу ли я как-то соединить эти 2 условия с ИЛИ?

Patryk
источник

Ответы:

46

Вы также можете сделать это с помощью отрицания -regex: -

 find ./ ! -regex  '.*\(deb\|vmdk\)$'
Алекс Лич
источник
6
Обратите внимание, что -regexэто менее портативный, чем -name.
jw013
145

Да, ты можешь:

find /media/d/ -type f -size +50M ! \( -name "*deb" -o -name "*vmdk" \)

Объяснение из спецификации POSIX :

! выражение : отрицание предмета; унарный оператор НЕ.

( выражение ): True, если выражение верно.

выражение выражение : чередование праймериз; оператор ИЛИ. Второе выражение не должно оцениваться, если первое выражение истинно.

Обратите внимание, что скобки, как открывающие, так и закрывающие, имеют префикс обратной косой черты ( \), чтобы предотвратить оценку оболочкой.

саржа
источник
2
Если вы выполняете -execили выполняете какие-либо другие действия с findрезультатами, не забудьте указать \( \)в скобках весь критерий, иначе он -execбудет применяться только к последнему -orкритерию. Чтобы поработать над всеми из них, заключите их в скобки:find \( <criterion> -o <criterion> \) -exec <command>
Виктор Сергиенко
25

Вы были близки к решению:

find /media/d/ -type f -size +50M -and ! -name "*deb" -and ! -name "*vmdk"

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

-a   -and      - operator AND
-o   -or       - operator OR
!              - operator NOT
Колодин
источник
6

Вы можете использовать регулярные выражения как в:

find /media/d -type f -size +50M ! -regex '\(.*deb\|.*vmdk\)'

Обратная косая черта является escape-символом; .соответствует одному символу и *служит для совпадения с предыдущим символом ноль или более раз, поэтому .*означает совпадение с нолем или более символов.

Франческо Турко
источник
1
Добавление объяснения сделает ваш ответ лучше.
NN
Вы правы. Добавлены некоторые пояснения.
Франческо Турко