GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So kopieren Sie Bilder in großen Mengen nur mit einer bestimmten Größe unter Linux

Siehe, ein interessantes Problem - oder Anforderung, wenn man so will. Sie haben einen Ordner voller Bilder, sagen wir Dutzende oder Hunderte. Und sie haben unterschiedliche Größen, z. B. eine Höhe von 480 oder 600 oder 1024 Pixel und eine Breite von 200, 320 oder 9000 Pixel, und Sie möchten nur hochwertige, großformatige Bilder aus diesem Ordner an einen anderen Ort kopieren . Dies manuell zu tun, kann eine lästige Pflicht sein.

In diesem Artikel möchte ich Ihnen einen relativ einfachen Befehl zeigen, den Sie in einem Terminalfenster ausführen können, mit dem Sie Ihre Bilder nach Größe herausfiltern und dann nur diejenigen mit einem Attribut kopieren können, das Ihnen gefällt. Bitte beachten Sie, dass es Dutzende verschiedener Möglichkeiten gibt, dies zu erreichen, und meine Lösung ist keineswegs einzigartig oder umfassend (für jeden möglichen Anwendungsfall), aber sie sollte den Zweck erfüllen. Fangen wir an.

Handelswerkzeuge

Die einzige Anwendung, die Sie zusätzlich zu den verschiedenen standardmäßigen Linux-Befehlszeilentools benötigen, ist ImageMagick, ein Bündel/eine Suite von Bildverarbeitungsdienstprogrammen. Es wird in den meisten Distributionen standardmäßig installiert, sodass Sie in den meisten Szenarien nichts tun müssen.

Einzeiler

Nun, der Befehl, den Sie brauchen, ist dieser:

ls *.FFF | xargs -I{} identifiziere -format '%i %w %h\n' {} | grep -w XXX | awk '{print $1}' | grep -v ^$ | xargs -I cp {} "Zielordner"

Was haben wir hier?

Hier ist die Aufschlüsselung der verschiedenen Aktionen:

  • Zuerst listen wir alle Dateien mit der FFF-Erweiterung (*.FFF) im aktuellen Ordner auf. Sie können dies natürlich in ein beliebiges Verzeichnis ändern oder eine ausgefeiltere Methode zum Suchen/Lokalisieren von Dateien verwenden, wie den Befehl find.
  • Dann verwenden wir xargs mit String-Ersetzung und leiten die Namen an das Identifizier-Dienstprogramm der ImageMagick-Suite weiter, das jeden Dateinamen verarbeitet und Attribute im Format '%i %w %h\n' ausgibt, was bedeutet:Dateiname, Breite, Höhe, Zeilenumbruchzeichen, also trennen wir die Ausgabe für jeden Eintrag. Hier haben Sie freie Meinungsäußerung - Sie können nur nach Breite oder Höhe oder anderen Eigenschaften suchen!
  • Dann grep wir Ganzworteinträge (-w), die einer bestimmten Größe entsprechen, z. B.:Breite (640). Sie können egrep verwenden, um mehrere Werte abzufangen, wenn Sie möchten, oder sogar reguläre Ausdrücke verwenden.
  • Als nächstes geben wir nur die Dateinamen von Dateien aus, die mit dem obigen grep-Qualifizierer übereinstimmen. Wir geben tatsächlich den ersten Wert mit awk aus, da die Ausgabe des Befehls eigentlich filename width height newline character ist, wie in:

Datei1.jpg 640 480
Datei2.jpg 320 200

  • Als Nächstes filtern wir alle leeren Zeilen heraus - in meinen Tests würde Identify manchmal leere Zeilen drucken, also wollen wir diese nicht in unseren Ergebnissen.
  • Dann übergeben wir die Dateinamen noch einmal an xargs und kopieren sie in einen Zielordner, der existieren muss. Wir verwenden die Option -I (Sie können auch die veraltete Option -i verwenden), um sicherzustellen, dass Dateinamen richtig geparst werden. Ist dies nicht der Fall, wird möglicherweise der folgende Fehler angezeigt:

cp:Ziel './file.jpg' ist kein Verzeichnis

Zweizeiler

Das obige sollte großartig funktionieren, aber wenn Sie aufgrund der feinen Unterschiede bei der Analyse von Dateinamen, Leerzeilen und Zeilenumbruchzeichen auf ein Problem stoßen, können Sie die Einzeiler in einen Zweizeiler vereinfachen, in den Sie zuerst die Ergebnisse schreiben eine Textdatei, und parsen Sie dann die Textdatei zum Kopieren:

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

Katzenliste.txt | grep -v ^$ | xargs -I cp {} "Zielordner"

Beispielsweise kopieren wir alle PNG-Bilder mit einer der beiden Abmessungen auf 800 Pixel:

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

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

Schlussfolgerung

Dort. Ich bin mir sicher, dass Sie ein Dutzend verschiedener Methoden und Anpassungen vorschlagen können, die dasselbe erreichen, vielleicht sogar eleganter als das, was ich geschrieben habe. Wenn ja, senden Sie mir bitte Ihre Vorschläge per E-Mail, und ich füge sie möglicherweise diesem Tutorial hinzu. Der Zweck dieses Artikels ist nicht, der heilige Gral der Skriptologie zu sein, sondern eine einfache Lösung für ein allgemeines Bedürfnis. Und es macht den Job gut.

Wie auch immer, wenn Sie Tonnen von Bildern, Fotos, Screenshots, was auch immer, mit unterschiedlichen Größen und Attributen haben, können Sie die Linux-Befehlszeile verwenden, um sie auf clevere Weise herauszufiltern, plus den ImageMagick-Identifizierbefehl. Wir sprechen sogar über Dinge wie Größe, Farbzuordnung und mehr. Lärm. Hoffentlich finden Sie dies ziemlich nützlich. Pass auf dich auf.


Linux
  1. So erstellen Sie Dateien einer bestimmten Größe unter Linux

  2. So installieren Sie ImageMagick unter Amazon Linux

  3. Wie zeigt man mit dem Linux-Befehl „cat“ nur bestimmte Zeilen nach Nummer an?

  4. So erhalten Sie die Verzeichnisgröße in Linux

  5. So finden Sie die Socket-Puffergröße von Linux

So erstellen Sie eine Montage aus Bildern unter Linux

So überprüfen Sie ISO-Images unter Linux

So ermitteln Sie die Gesamtgröße eines Verzeichnisses in Linux

So erstellen Sie ein Video aus Bildern unter Linux

So listen Sie nur Verzeichnisse in Linux auf

Wie listet man alle Dateien in Linux nach Größe sortiert auf?