GNU/Linux >> Linux Esercitazione >  >> Linux

Come copiare in blocco le immagini solo di determinate dimensioni in Linux

Ecco, un problema interessante - o requisito, se vuoi. Hai una cartella piena di immagini, diciamo decine o centinaia. E sono di dimensioni diverse, ad esempio altezza di 480 o 600 o 1024 pixel e larghezza di 200, 320 o 9000 pixel, e vorresti copiare solo immagini di alta qualità e di grandi dimensioni da questa cartella in una posizione separata . Farlo manualmente può essere un lavoro ingrato.

In questo articolo, vorrei mostrarti un comando relativamente semplice che puoi eseguire in una finestra di terminale, che ti consentirà di filtrare le tue immagini in base alle dimensioni e quindi copiare solo quelle con un attributo che ti piace. Ora, tieni presente che ci sono dozzine di modi diversi per farlo, e la mia soluzione non è in alcun modo unica o completa (per ogni possibile caso d'uso), ma dovrebbe fare il trucco bene. Cominciamo.

Strumenti del mestiere

L'unica applicazione di cui avrai bisogno, oltre ai vari strumenti da riga di comando Linux predefiniti, è ImageMagick, che è un pacchetto/suite di utilità di elaborazione delle immagini. È già installato nella maggior parte delle distribuzioni, quindi non dovrai fare nulla nella maggior parte degli scenari.

Una riga

Ora, il comando di cui hai bisogno è questo:

ls *.FFF | xargs -I{} identifica -format '%i %w %h\n' {} | grep -w XXX | awk '{stampa $1}' | grep -v ^$ | xargs -I cp {} "cartella di destinazione"

Cosa abbiamo qui?

Ecco la ripartizione delle diverse azioni:

  • Per prima cosa elenchiamo tutti i file con estensione FFF (*.FFF) nella cartella corrente. Ovviamente puoi cambiarlo in qualsiasi directory che ti piace, o usare un metodo più sofisticato per trovare/trovare file, come il comando trova.
  • Quindi, utilizziamo xargs con la sostituzione della stringa e reindirizzamo i nomi all'utilità di identificazione della suite ImageMagick, che elabora ogni nome di file e stampa gli attributi nel formato '%i %w %h\n', che significa:nome file, larghezza, altezza, carattere di nuova riga, quindi separiamo l'output per ogni voce. Qui hai libertà di espressione:puoi cercare solo larghezza o altezza o altre proprietà!
  • Quindi, grepiamo voci intere (-w) che corrispondono a una certa dimensione, ad esempio:larghezza (640). Puoi egrep per catturare più valori, se lo desideri, o anche utilizzare espressioni regolari.
  • Successivamente, stampiamo solo i nomi dei file che corrispondono al qualificatore grep sopra. In realtà stampiamo il primo valore con awk, poiché l'output del comando è in realtà nome file larghezza altezza carattere newline, come in:

file1.jpg 640 480
file2.jpg 320 200

  • Successivamente, filtriamo tutte le righe vuote:nei miei test, a volte, l'identificativo stampava righe vuote, quindi non le vogliamo nei nostri risultati.
  • Poi passiamo nuovamente i nomi dei file a xargs e li copiamo in una cartella di destinazione, che deve esistere. Usiamo l'opzione -I (puoi anche usare l'opzione -i deprecata) per assicurarci che i nomi dei file vengano analizzati correttamente. In caso contrario, potresti riscontrare il seguente errore:

cp:target './file.jpg' non è una directory

Due fodera

Quanto sopra dovrebbe funzionare alla grande, ma se riscontri un problema a causa delle delicate differenze nel modo in cui gli strumenti analizzano i nomi dei file, le righe vuote e i caratteri di nuova riga, puoi quindi semplificare la riga di una riga in una riga doppia, dove prima scrivi i risultati in un file di testo, quindi analizza il file di testo per la copia:

ls *.FFF | xargs -I{} identifica -format '%i %w %h\n' {} | grep -w XXX | awk '{stampa $1}' | tee list.txt

lista dei gatti.txt | grep -v ^$ | xargs -I cp {} "cartella di destinazione"

Ad esempio, copiamo tutte le immagini PNG con entrambe le dimensioni impostate su 800 px:

ls *.png | xargs -I{} identifica -format '%i %w %h\n' {} | grep -w 800 | awk '{stampa $1}' | tee list.txt

lista dei gatti.txt | grep -v ^$ | xargs -I cp {} ./dir-only-big-files

Conclusione

Là. Ora, sono certo che puoi proporre una dozzina di metodi e ritocchi diversi che otterranno lo stesso risultato, forse anche in modo più elegante di quello che ho scritto. In tal caso, inviami un'e-mail con i tuoi suggerimenti e potrei aggiungerli a questo tutorial. Lo scopo di questo articolo non è quello di essere il Santo Graal della scrittura, ma una semplice soluzione per un bisogno comune. E fa bene il suo lavoro.

Ad ogni modo, se hai tonnellate di immagini, foto, schermate, qualsiasi cosa, di dimensioni e attributi diversi, puoi utilizzare la riga di comando di Linux per filtrarli in modo intelligente, oltre al comando di identificazione di ImageMagick. Parliamo anche di cose come dimensioni, mappatura dei colori e altro ancora. Rumore. Si spera che lo troverai piuttosto utile. Abbi cura di te.


Linux
  1. Come escludere file di determinate dimensioni dalla copia in Linux

  2. Come installare ImageMagick su Amazon Linux

  3. Con il comando "cat" di Linux, come mostrare solo determinate righe per numero?

  4. Come aumentare le dimensioni dello scambio su Ubuntu Linux

  5. Come creare un file con una determinata dimensione in Linux?

Come creare un montaggio da immagini in Linux

Come verificare le immagini ISO in Linux

Come trovare la dimensione totale di una directory in Linux

Come creare un video da immagini in Linux

Come elencare solo le directory in Linux

Come elencare tutti i file ordinati per dimensione in Linux?