Komut satırını kullanarak belirli bir piksel boyutuna sahip tüm görüntüleri nasıl bulabilirim?


16

Genişliği veya yüksekliği 300 pikselin altında olan alt klasörleri olan bir klasör içindeki tüm JPG görüntüleri bulmaya çalışıyorum.

Bu şekilde eski küçük resimleri tespit edip silmek istiyorum.

Eminim tüm görüntüleri kullanarak bulabilirsiniz find:

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

Ama borudan sonra ne olur? Resmin niteliklerini tespit etmek için hangi paketi kullanabilirim?

Yanıtlar:


17

Sen kullanabilirsiniz identifygelen imagemagickve aşağıdaki komutu kullanabilirsiniz:

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

kullanımı, -exec <command> '{}' \;dosya adınızın içinde boşluk olmasını sağlar, alternatif olarak

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

nerede -I{}aynı şey ilgilenir.

Ne gibi identifyçıktı biçimi belirtebilirsiniz olmasıdır; bu durumda '%w %h %i'görüntünün genişliğini, yüksekliğini ve tam yol adını verir. Daha sonra awkifade yalnızca görüntünün istenen boyuttan daha küçük olduğu çizgileri tutar.

Çıktı örneği:

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

Düzenle: dosya adları sadece (boru tesisatı için isterseniz rmörneğin), basitçe değiştirmek $linede awkhiç açıklamaya $3, o zaman sadece üçüncü sütun yazdırılır.


3
Awk kısmı kısaltılabilir: | awk '$1<300||$2<300'veya | awk '$1<300||$2<300{print $3}'(sadece 3. sütun gerektiğinde).
har-wradim

@ har-wradim Teşekkürler, hoş bir öneri!
Gerhard Burger

7
Benim '%w %h %i\n'için çalışması için bir satırsonu ( ) eklemem gerekiyordu.
qwr

6 yıllık bir soru için yazmak için üzgünüm, ama bu benim soru kısmen kısmen google go bu tek sonuçtur, temelde istediğim şey belirli boyutlarda veya belirli boyutlar içinde görüntüleri bulmak ve sonra başka bir dizine kopyalamak. Ben cp kopyalamak için kullanılır biliyorum, ama ben bu komutu cp ile entegre başarısız.
GhostOrder

@GhostOrder, yalnızca 3. sütunu yazdırmak için @ har-wradim'in önerisini takip edin, ardından böyle bir şeyle başka bir boru ekleyin| xargs -I {} mv {} /destination/directory/
Gerhard Burger

1

Kabul edilen cevabın çok iyi olduğunu düşünüyorum, ancak başka bir olası çözüm eklemek istedim ...

ImageMagickAraçları en sık kullandığım halde , netpbmgörüntüleri işlemek için eski bir arkadaşım. Komut ile herhangi bir görüntü biçiminin boyutunu görebilirsiniz:

anytopnm file | pamfile

Bu, şuna benzer bir çıktı oluşturur:

stdin:  PPM raw, 1650 by 1275  maxval 255

"Borudan sonra ne var?" Sorusunu cevaplamak için kullandığımdan while readdaha sık kullanıyorum xargsçünkü daha esnek. Benim netpbmsorunun cevabı aşağıdaki gibidir:

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

1

Bu benim için çalıştı:

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

Bu çıktı örneği:

./2520161636481000.png 75x75

./2620160819191100.png 75x75

./2420181545550700.png 75x75


0

identifyDan komut imagemagickpaketinde istediğini yapar:

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

Yine, grepgörüntü boyutunu sıralamak için kullanmanız gerekir .

Ancak, çok çeşitli görüntü boyutlarına sahip olmadığınız sürece, findbelirli bir boyutun altındaki JPEG dosyalarını kaldırmak için kullanmanın daha kolay olacağını düşünüyorum :

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

( -deleteİlk kontrol olmadan koşmaya değer tutmak istediğiniz şeyleri bulamaz - aksi takdirde silmeden önce size sormaz).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.