Bagaimana cara menggabungkan 2 kondisi name di find?

94

Saya ingin mencari file yang tidak cocok dengan 2 -namekondisi. Saya bisa melakukannya seperti ini:

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

dan ini akan menghasilkan hasil yang tepat tetapi bisakah saya bergabung dengan 2 kondisi ini dengan OR entah bagaimana?

Patryk
sumber

Jawaban:

46

Anda dapat melakukan ini dengan menggunakan negasi -regexjuga: -

 find ./ ! -regex  '.*\(deb\|vmdk\)$'
Alex Leach
sumber
6
Catatan yang -regexkurang portabel dibandingkan -name.
jw013
145

ya kamu bisa:

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

Penjelasan dari spesifikasi POSIX :

! ekspresi : Negasi primer; operator BUKAN unary.

( ekspresi ): Benar jika ekspresi itu benar.

ekspresi -o ekspresi : Pergantian primer; operator ATAU. Ungkapan kedua tidak akan dievaluasi jika ungkapan pertama benar.

Perhatikan bahwa tanda kurung, baik membuka dan menutup, diawali dengan garis miring terbalik ( \) untuk mencegah evaluasi oleh shell.

Serge
sumber
2
Jika Anda melakukan -execatau tindakan lain pada findhasilnya, ingat untuk menyisipkan \( \)seluruh kriteria, jika tidak -execakan berlaku hanya untuk -orkriteria terakhir . Untuk mengerjakan semuanya, beri tanda kurung mereka:find \( <criterion> -o <criterion> \) -exec <command>
Victor Sergienko
25

Anda sudah dekat dengan solusi:

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

Anda dapat menggabungkan operator logika berikut dalam urutan apa pun:

-a   -and      - operator AND
-o   -or       - operator OR
!              - operator NOT
DenisKolodin
sumber
6

Anda dapat menggunakan ekspresi reguler seperti pada:

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

Backslash adalah karakter pelarian; .cocok dengan satu karakter, dan *berfungsi untuk mencocokkan karakter sebelumnya nol atau lebih banyak kali, jadi .*artinya cocok dengan nol atau lebih banyak karakter.

Francesco Turco
sumber
1
Menambahkan penjelasan akan membuat jawaban Anda lebih baik.
NN
Kamu benar. Menambahkan beberapa penjelasan.
Francesco Turco