Як поєднувати 2-іменні умови у знаходженні?


94

Я хотів би шукати файли, які не відповідали б двом -nameумовам. Я можу це зробити так:

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

і це дасть належний результат, але чи можу я приєднатись до цих двох умов з АБО якось?

Відповіді:


46

Ви можете це зробити і за допомогою відміни -regex:

 find ./ ! -regex  '.*\(deb\|vmdk\)$'

6
Зауважте, що -regexце менш портативно, ніж -name.
jw013

145

так, ти можеш:

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

Пояснення зі специфікації POSIX :

! вираз : заперечення первинного; Одинарний оператор НЕ.

( вираз ): вірно, якщо вираз є істинним.

вираз -o вираз : чергування праймеріз; оператор АБО. Другий вираз не оцінюється, якщо перший вираз є істинним.

Зауважте, що круглі дужки, як відкривання, так і закриття, встановлені зворотною косою рисою ( \), щоб запобігти оцінці оболонкою.


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\)'

Зворотна риса - характер втечі; .відповідає одному символу і *служить для відповідності попереднього символу нулю або більше разів, тому .*означає, що відповідає нулю або більше символів.


1
Додавання пояснення зробить вашу відповідь кращою.
NN

Ти правий. Додано кілька пояснень.
Франческо Турко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.