Come trovare tutte le immagini con una determinata dimensione di pixel usando la riga di comando?


16

Sto cercando di trovare tutte le immagini JPG all'interno di una cartella con sottocartelle con larghezza o altezza inferiore a 300 px.

In questo modo voglio rilevare le anteprime vecchie ed eliminarle.

Sicuramente posso trovare tutte le immagini usando find:

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

Ma cosa segue dopo la pipa? Quale pacchetto posso usare per rilevare gli attributi dell'immagine?

Risposte:


17

Puoi usare identifyda imagemagicke puoi usare il seguente comando:

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

l'uso di -exec <command> '{}' \;assicura che il tuo nome file possa contenere spazi, in alternativa puoi usarlo

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

dove -I{}si occupa della stessa cosa.

Quello che mi piace identifyè che puoi specificare il formato di output; in questo caso, '%w %h %i'che indica la larghezza, l'altezza e il percorso completo dell'immagine. Quindi l' awkespressione mantiene solo quelle linee per le quali l'immagine è più piccola della dimensione desiderata.

Esempio dell'output:

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

Modifica: se desideri solo i nomi dei file (ad rmesempio per il piping ), modifica semplicemente $linel' awkistruzione in $3, quindi stamperà solo la terza colonna.


3
La parte awk può essere ridotta: | awk '$1<300||$2<300'oppure | awk '$1<300||$2<300{print $3}'(quando è necessaria solo la terza colonna).
Har-Wradim,

@ har-wradim Grazie, bel suggerimento!
Gerhard Burger,

7
Ho dovuto aggiungere un newline ( '%w %h %i\n') per farlo funzionare per me.
qwr

Ci scusiamo per aver scritto in una domanda di 6 anni, ma questo è l'unico risultato che trovo su Google che risponde parzialmente alla mia domanda, sostanzialmente quello che voglio è trovare immagini con o all'interno di dimensioni specifiche e quindi copiarle in un'altra directory. So che cp è usato per copiare, ma non riesco a integrare questo comando con cp.
GhostOrder

@GhostOrder segui il suggerimento di @ har-wradim per stampare solo la terza colonna, quindi aggiungi un'altra pipe con qualcosa del genere| xargs -I {} mv {} /destination/directory/
Gerhard Burger

1

Penso che la risposta accettata sia molto buona, ma volevo aggiungere un'altra possibile soluzione ...

Anche se uso gli ImageMagickstrumenti più spesso adesso, netpbmè un vecchio amico per l'elaborazione delle immagini. Puoi vedere le dimensioni di qualsiasi formato di immagine con il comando:

anytopnm file | pamfile

Questo genererà un output simile a:

stdin:  PPM raw, 1650 by 1275  maxval 255

Per rispondere alla domanda "cosa segue dopo la pipa?", Utilizzo while readpiù spesso di quanto utilizzi xargsperché è più flessibile. La mia netpbmrisposta alla domanda è simile alla seguente:

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

Questo ha funzionato per me:

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

Questo è l'esempio di output:

./2520161636481000.png 75x75

./2620160819191100.png 75x75

./2420181545550700.png 75x75


0

Il identifycomando dal imagemagickpacchetto fa quello che vuoi:

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

Ancora una volta, dovrai quindi utilizzare grepper ordinare le dimensioni dell'immagine.

Tuttavia, sospetto che a meno che tu non abbia una gamma molto ampia di dimensioni dell'immagine, sarebbe più semplice da usare find per rimuovere file JPEG al di sotto di una determinata dimensione:

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

(Vale la pena correre senza -deleteprima verificare che non trovi cose che vuoi conservare - altrimenti non ti chiederà prima di cancellarle).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.