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.