Відповіді:
так, ти можеш:
find /media/d/ -type f -size +50M ! \( -name "*deb" -o -name "*vmdk" \)
Пояснення зі специфікації POSIX :
! вираз : заперечення первинного; Одинарний оператор НЕ.
( вираз ): вірно, якщо вираз є істинним.
вираз -o вираз : чергування праймеріз; оператор АБО. Другий вираз не оцінюється, якщо перший вираз є істинним.
Зауважте, що круглі дужки, як відкривання, так і закриття, встановлені зворотною косою рисою ( \
), щоб запобігти оцінці оболонкою.
-exec
чи будь-які інші дії щодо find
результатів, не забудьте поставити в дужки \( \)
цілі критерії, інакше -exec
буде застосовано лише до -or
критерію останнього значення . Щоб попрацювати над усіма ними, зробіть їх у дужках:find \( <criterion> -o <criterion> \) -exec <command>
Ви були близькими до рішення:
find /media/d/ -type f -size +50M -and ! -name "*deb" -and ! -name "*vmdk"
Ви можете комбінувати такі логічні оператори в будь-якій послідовності:
-a -and - operator AND
-o -or - operator OR
! - operator NOT
Ви можете використовувати регулярні вирази, як у:
find /media/d -type f -size +50M ! -regex '\(.*deb\|.*vmdk\)'
Зворотна риса - характер втечі; .
відповідає одному символу і *
служить для відповідності попереднього символу нулю або більше разів, тому .*
означає, що відповідає нулю або більше символів.
-regex
це менш портативно, ніж-name
.