Ответы:
Да, ты можешь:
find /media/d/ -type f -size +50M ! \( -name "*deb" -o -name "*vmdk" \)
Объяснение из спецификации POSIX :
! выражение : отрицание предмета; унарный оператор НЕ.
( выражение ): True, если выражение верно.
выражение -о выражение : чередование праймериз; оператор ИЛИ. Второе выражение не должно оцениваться, если первое выражение истинно.
Обратите внимание, что скобки, как открывающие, так и закрывающие, имеют префикс обратной косой черты ( \), чтобы предотвратить оценку оболочкой.
-execили выполняете какие-либо другие действия с findрезультатами, не забудьте указать \( \)в скобках весь критерий, иначе он -execбудет применяться только к последнему -orкритерию. Чтобы поработать над всеми из них, заключите их в скобки:find \( <criterion> -o <criterion> \) -exec <command>
Вы можете использовать регулярные выражения как в:
find /media/d -type f -size +50M ! -regex '\(.*deb\|.*vmdk\)'
Обратная косая черта является escape-символом; .соответствует одному символу и *служит для совпадения с предыдущим символом ноль или более раз, поэтому .*означает совпадение с нолем или более символов.
-regexэто менее портативный, чем-name.