Voici un problème intéressant - ou une exigence, si vous voulez. Vous avez un dossier plein d'images, disons des dizaines ou des centaines. Et ils sont de tailles différentes, disons une hauteur de 480 ou 600 ou 1024 pixels et une largeur de 200, 320 ou 9000 pixels, et vous souhaitez copier uniquement des images de haute qualité et de grande taille de ce dossier dans un emplacement séparé . Faire cela manuellement peut être une corvée.
Dans cet article, j'aimerais vous montrer une commande relativement simple que vous pouvez exécuter dans une fenêtre de terminal, qui vous permettra de filtrer vos images par taille, puis de ne copier que celles avec un attribut que vous aimez. Maintenant, sachez qu'il existe des dizaines de façons différentes d'y parvenir, et ma solution n'est en aucun cas unique ou complète (pour tous les cas d'utilisation possibles), mais elle devrait très bien faire l'affaire. Commençons.
Outils du métier
La seule application dont vous aurez besoin, en plus des divers outils de ligne de commande Linux par défaut, est ImageMagick, qui est un ensemble/suite d'utilitaires de traitement d'image. Il est installé dans la plupart des distributions par défaut, vous n'aurez donc rien à faire dans la plupart des scénarios.
Une ligne
Maintenant, la commande dont vous avez besoin est celle-ci :
ls *.FFF | xargs -I{} identifier -format '%i %w %h\n' {} | grep -w XXX | awk '{imprimer $1}' | grep-v ^$ | xargs -I cp {} "dossier de destination"
Qu'avons-nous ici ?
Voici la répartition des différentes actions :
- D'abord, nous listons tous les fichiers avec l'extension FFF (*.FFF) dans le dossier actuel. Vous pouvez bien sûr le remplacer par n'importe quel répertoire de votre choix ou utiliser une méthode plus sophistiquée pour rechercher/localiser des fichiers, comme la commande find.
- Ensuite, nous utilisons xargs avec remplacement de chaîne et dirigeons les noms vers l'utilitaire d'identification de la suite ImageMagick, qui traite chaque nom de fichier et imprime les attributs au format '%i %w %h\n', ce qui signifie :nom de fichier, largeur, hauteur, caractère de nouvelle ligne afin que nous séparions la sortie pour chaque entrée. Ici, vous avez une liberté d'expression - vous ne pouvez rechercher que la largeur ou la hauteur ou d'autres propriétés !
- Ensuite, nous grépons les entrées de mots entiers (-w) qui correspondent à une certaine taille, par exemple :largeur (640). Vous pouvez egrep pour capturer plusieurs valeurs, si vous le souhaitez, ou même utiliser des expressions régulières.
- Ensuite, nous n'affichons que les noms de fichiers correspondant au qualificateur grep ci-dessus. Nous imprimons en fait la première valeur avec awk, car la sortie de la commande est en fait le caractère de saut de ligne largeur hauteur du nom de fichier, comme dans :
fichier1.jpg 640 480
fichier2.jpg 320 200
- Ensuite, nous filtrons toutes les lignes vides :dans mes tests, parfois, identifier imprime des lignes vides, nous ne voulons donc pas qu'elles figurent dans nos résultats.
- Nous transmettons ensuite à nouveau les noms de fichiers à xargs et les copions dans un dossier de destination, qui doit exister. Nous utilisons l'option -I (vous pouvez également utiliser l'option obsolète -i) pour nous assurer que les noms de fichiers sont correctement analysés. Si ce n'est pas le cas, vous pouvez rencontrer l'erreur suivante :
cp :la cible './file.jpg' n'est pas un répertoire
Deux lignes
Ce qui précède devrait fonctionner très bien, mais si vous rencontrez un problème en raison des différences délicates dans la façon dont les outils analysent les noms de fichiers, les lignes vides et les caractères de nouvelle ligne, vous pouvez ensuite simplifier la ligne en une ligne à deux, où vous écrivez d'abord les résultats dans un fichier texte, puis analysez le fichier texte pour le copier :
ls *.FFF | xargs -I{} identifier -format '%i %w %h\n' {} | grep -w XXX | awk '{imprimer $1}' | tee list.txt
liste de chats.txt | grep-v ^$ | xargs -I cp {} "dossier de destination"
Par exemple, nous copions toutes les images PNG avec l'une ou l'autre dimension définie sur 800 px :
ls *.png | xargs -I{} identifier -format '%i %w %h\n' {} | grep-w 800 | awk '{imprimer $1}' | tee list.txt
liste de chats.txt | grep-v ^$ | xargs -I cp {} ./dir-only-big-files
Conclusion
Là. Maintenant, je suis certain que vous pouvez proposer une douzaine de méthodes et d'ajustements différents qui accompliront la même chose, peut-être même plus élégamment que ce que j'ai écrit. Si tel est le cas, envoyez-moi vos suggestions par e-mail et je les ajouterai peut-être à ce didacticiel. Le but de cet article n'est pas d'être le Saint Graal de la scriptologie, mais une solution simple à un besoin commun. Et ça fait bien le travail.
Quoi qu'il en soit, si vous avez des tonnes d'images, de photos, de captures d'écran, peu importe, de tailles et d'attributs variés, vous pouvez utiliser la ligne de commande Linux pour les filtrer de manière intelligente, ainsi que la commande d'identification ImageMagick. Nous parlons même de choses comme la taille, la cartographie des couleurs et plus encore. Bruit. J'espère que vous trouverez cela plutôt utile. Prenez soin de vous.