Odpowiedzi:
Możesz to zrobić również przy użyciu negacji -regex
: -
find ./ ! -regex '.*\(deb\|vmdk\)$'
tak, możesz:
find /media/d/ -type f -size +50M ! \( -name "*deb" -o -name "*vmdk" \)
Objaśnienie ze specyfikacji POSIX :
! wyrażenie : Negacja pierwszorzędnej; jednoargumentowy operator NOT.
( wyrażenie ): Prawda, jeśli wyrażenie jest prawdziwe.
wyrażenie -o wyrażenie : Alternacja pierwotnych; operator OR. Drugie wyrażenie nie będzie oceniane, jeśli pierwsze wyrażenie jest prawdziwe.
Zauważ, że nawiasy otwierające i zamykające są poprzedzone odwrotnym ukośnikiem ( \
), aby zapobiec ocenie przez powłokę.
-exec
inne czynności na find
wynikach, pamiętaj o nawiasowaniu \( \)
całych kryteriów, w przeciwnym razie -exec
będzie miało zastosowanie tylko do ostatniego -or
kryterium. Aby pracować nad wszystkimi, nawiasuj je:find \( <criterion> -o <criterion> \) -exec <command>
Jesteś blisko rozwiązania:
find /media/d/ -type f -size +50M -and ! -name "*deb" -and ! -name "*vmdk"
Możesz łączyć następujące operatory logiczne w dowolnej kolejności:
-a -and - operator AND
-o -or - operator OR
! - operator NOT
Możesz używać wyrażeń regularnych jak w:
find /media/d -type f -size +50M ! -regex '\(.*deb\|.*vmdk\)'
Odwrotny ukośnik jest znakiem ucieczki; .
dopasowuje pojedynczy znak i *
służy do dopasowania poprzedniego znaku zero lub więcej razy, więc .*
oznacza dopasowanie zero lub więcej znaków.
-regex
jest mniej przenośny niż-name
.