Cara menggunakan perintah find untuk mencari beberapa ekstensi

Jawaban:

153

Gunakan -otanda di antara berbagai parameter.

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) bekerja seperti pesona.

CATATAN Ada harus menjadi ruang antara braket dan isinya atau itu tidak akan berhasil.

Penjelasan:

  • type -f - hanya mencari file (bukan direktori)
  • \(- diperlukan type -fagar berlaku untuk semua argumen
  • -o - operator logika ATAU
  • -iname- seperti -name, tetapi pertandingan tidak peka huruf besar-kecil
Shadur
sumber
Apakah Anda memerlukan tanda kurung. Perintah itu bekerja untukku tanpa mereka. Apakah mereka diperlukan untuk beberapa kerang?
MikeD
2
@miked Perintah ini akan "bekerja" tanpa mereka, ya, tetapi Anda akhirnya akan mendapatkan hit pada direktori yang berakhiran .png serta file yang diakhiri dengan .jpg, yang tidak persis seperti yang dimaksudkan.
Shadur
1
Terima kasih telah mengklarifikasi! Itu type -ftidak meluas dan berlaku untuk kedua ekspresi tanpa tanda kurung, Jadi, find ./ -type f -iname \*.jpg -o -type f -iname \*.pngjuga berfungsi ... meskipun dua karakter lebih panjang :-)
MikeD
2
Ini masalah prioritas operator. Sama seperti a * b + cberbeda daria * (b + c)
Shadur
2
@ jdhao Tangkapan bagus, diamandemen.
Shadur
86

Anda dapat menggabungkan kriteria dengan -oseperti yang disarankan oleh Shadur . Perhatikan bahwa -omemiliki prioritas lebih rendah daripada penjajaran, jadi Anda mungkin perlu tanda kurung.

find . -name '*.jpg' -o -name '*.png'
find . -mtime -7 \( '*.jpg' -o -name '*.png' \)  # all .jpg or .png images modified in the past week

Di Linux, Anda dapat menggunakan -regexuntuk menggabungkan ekstensi dengan cara terser. Sintaks regexp default adalah Emacs ( regexps dasar ditambah beberapa ekstensi seperti \|untuk pergantian); ada opsi untuk beralih ke regexps yang diperluas .

find -regex '.*\.\(jpg\|png\)'
find -regextype posix-extended -regex '.*\.(jpg|png)'

Pada FreeBSD, NetBSD dan OSX, Anda dapat menggunakan -regexgabungan dengan -Euntuk regexps yang diperluas.

find -E . -regex '.*\.(jpg|png)'
Gilles
sumber
Itu selalu lebih baik untuk digunakan -inamedaripada -name- maka Anda juga akan menangkap image.JPGdanimage.PnG
ccpizza
40

Ini lebih benar:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'
Dimitry
sumber
10
Mengapa Anda mengatakan itu "lebih" benar?
Kevin
2
@ Kevin Saya kira karena -iregexcocok jpgjuga JPG Jpg jpGdan semacamnya. Saya pikir $tidak diperlukan.
ott--
Ini berfungsi dengan baik di MinGW .
Peter Mortensen
2
Pertama, Anda menghapus folder pencarian sebagai argumen pertama yang akan menimbulkan kesalahan. Kedua, pada OSX lolos kurung tidak akan bekerja, dan ini harus digunakan sebagai gantinya: find -E . -iregex '.*\.(jpg|png|gif)'seperti yang ditunjukkan dalam jawaban @ sorin.
ccpizza
8

Untuk memperjelasnya, satu-satunya opsi yang berfungsi di Linux, Unix dan rasa macOS adalah:

find -E . -regex '.*\.(jpg|png)'

Itu karena versi OS X sedikit berbeda, tetapi itu penting untuk menulis hal-hal yang berjalan baik di sebagian besar platform.

Sorin
sumber
2
-E flag tidak valid untuk ditemukan di Ubuntu 14.04
gogaman
Bendera -E juga tidak berlaku pada MinGW (setidaknya versi / konfigurasi yang saya coba (konfigurasi default untuk versi tertentu)).
Peter Mortensen
Bagian mana dari yang -type f \( -iname \*.png -o -iname \*.jpg\)tidak berfungsi pada OSX?
Shadur
-3
/\.(jpe?g|png|gif|bmp)$/i;

Gunakan.

rohit gour
sumber
5
Anda mungkin perlu sedikit menjelaskan hal ini.
kekacauan