Bagaimana menemukan semua gambar dengan ukuran piksel tertentu menggunakan commandline?

16

Saya mencoba menemukan semua gambar JPG dalam folder dengan subfolder yang memiliki lebar atau tinggi di bawah 300px.

Dengan cara ini saya ingin mendeteksi thumbnail lama dan menghapusnya.

Yang pasti saya dapat menemukan semua gambar menggunakan find:

find . -iname "*.jpg" -type f | ...

Tapi apa yang terjadi setelah pipa? Paket mana yang dapat saya gunakan untuk mendeteksi atribut gambar?

mcbetz
sumber

Jawaban:

17

Anda dapat menggunakan identifydari imagemagick, dan Anda dapat menggunakan perintah berikut:

find . -iname "*.jpg" -type f -exec identify -format '%w %h %i' '{}' \; | awk '$1<300 || $2<300'

penggunaan -exec <command> '{}' \;memastikan bahwa nama file Anda dapat memiliki ruang di dalamnya, atau Anda dapat menggunakan

find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1<300 || $2<300'

di mana -I{}mengurus hal yang sama.

Yang saya sukai identifyadalah Anda dapat menentukan format output; dalam hal ini '%w %h %i'yang memberikan lebar, tinggi, dan pathname lengkap dari gambar. Maka awkekspresi hanya menyimpan garis-garis yang gambarnya lebih kecil dari ukuran yang diinginkan.

Contoh output:

64 64 ./thumbsup.jpg
100 150 ./photomin.jpg

Edit: Jika Anda ingin nama file saja (untuk pipa untuk rmmisalnya), hanya mengubah $linedalam awkpernyataan $3, maka hanya akan mencetak kolom ketiga.

Burger Gerhard
sumber
3
Bagian awk dapat dibuat lebih pendek: | awk '$1<300||$2<300'atau | awk '$1<300||$2<300{print $3}'(ketika hanya kolom ke-3 diperlukan).
har-wradim
@ har-wradim Terima kasih, saran yang bagus!
Gerhard Burger
7
Saya harus menambahkan baris baru ( '%w %h %i\n') agar berfungsi untuk saya.
qwr
Maaf untuk menulis dalam 6 tahun pertanyaan, tetapi ini adalah satu-satunya hasil yang saya temukan di google yang sebagian menjawab pertanyaan saya, pada dasarnya apa yang saya inginkan adalah menemukan gambar dengan atau dalam dimensi tertentu dan kemudian menyalinnya ke direktori lain. Saya tahu cp digunakan untuk menyalin, tetapi saya gagal mengintegrasikan perintah ini dengan cp.
GhostOrder
@GhostOrder ikuti saran @ har-wradim untuk hanya mencetak kolom ke-3, lalu tambahkan pipa lain dengan sesuatu seperti ini| xargs -I {} mv {} /destination/directory/
Gerhard Burger
1

Saya pikir jawaban yang diterima sangat bagus, tetapi saya ingin menambahkan solusi lain yang mungkin ...

Meskipun ImageMagicksekarang saya paling sering menggunakan alat, saya netpbmadalah teman lama untuk memproses gambar. Anda dapat melihat ukuran format gambar apa pun dengan perintah:

anytopnm file | pamfile

Ini akan menghasilkan output yang terlihat seperti:

stdin:  PPM raw, 1650 by 1275  maxval 255

Untuk menjawab pertanyaan "apa yang mengikuti setelah pipa?", Saya menggunakan while readlebih sering daripada yang saya gunakan xargskarena lebih fleksibel. netpbmJawaban saya untuk pertanyaannya terlihat seperti ini:

find -iname \*.jpg | while read img; do \
  anytopnm "$img" | pamfile | \
    perl -ane 'exit 1 if $F[3]<300 || $F[5]<300' || rm -v "$img"; \
done
NateT
sumber
1

Ini bekerja untuk saya:

find . -iname "*.png" -type f -exec identify -format '%i %wx%h\n' '{}' \; | grep '75x75'

Ini adalah sampel keluaran:

./2520161636481000.png 75x75

./2620160819191100.png 75x75

./2420181545550700.png 75x75

osroflo
sumber
0

The identifyperintah dari imagemagickpaket melakukan apa yang Anda inginkan:

$ identify abc.jpg
abc.jpg JPEG 1952x3264 1952x3264+0+0 8-bit DirectClass 1.111MB 0.000u 0:00.000

Sekali lagi, Anda perlu menggunakannya grepuntuk memilah ukuran gambar.

Namun, saya menduga bahwa kecuali Anda memiliki kisaran ukuran gambar yang sangat luas, akan lebih mudah hanya digunakan finduntuk menghapus file JPEG di bawah ukuran yang diberikan:

find -iname '*.jpg' -size -10k -delete

(Layak berjalan tanpa -deleteterlebih dahulu untuk memeriksa tidak menemukan hal-hal yang ingin Anda pertahankan - itu tidak akan meminta Anda sebelum menghapus sebaliknya).

kronis
sumber