Come combinare condizioni 2-name in find?


94

Vorrei cercare file che non corrispondessero a 2 -namecondizioni. Posso farlo in questo modo:

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

e questo produrrà il risultato corretto ma posso unire queste 2 condizioni con OR in qualche modo?

Risposte:


46

Puoi farlo anche usando un negato -regex: -

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

6
Si noti che -regexè meno portatile di -name.
jw013,

145

si, puoi:

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

Spiegazione dalle specifiche POSIX :

! espressione : negazione di una primaria; l'operatore NOT unario.

( espressione ): vero se espressione è vera.

espressione -o espressione : alternanza di primarie; l'operatore OR. La seconda espressione non deve essere valutata se la prima espressione è vera.

Si noti che la parentesi, sia in apertura che in chiusura, è preceduta da una barra rovesciata ( \) per impedire la valutazione da parte della shell.


2
Se stai facendo -execo qualsiasi altra azione sui findrisultati, ricorda di selezionare \( \)tutti i criteri, altrimenti -execsi applicherà solo al -orcriterio ultimo . Per lavorare su tutti, parentesi:find \( <criterion> -o <criterion> \) -exec <command>
Victor Sergienko,

25

Eri vicino alla soluzione:

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

È possibile combinare i seguenti operatori logici in qualsiasi sequenza:

-a   -and      - operator AND
-o   -or       - operator OR
!              - operator NOT

6

Puoi usare espressioni regolari come in:

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

Backslash è il personaggio di escape; .corrisponde a un singolo carattere e *serve per abbinare il carattere precedente zero o più volte, quindi .*significa che corrisponde a zero o più caratteri.


1
L'aggiunta di una spiegazione renderebbe migliore la tua risposta.
NN,

Hai ragione. Aggiunte alcune spiegazioni.
Francesco Turco,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.