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

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

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

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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.