Ich habe eine große Anzahl (mehr als 400) von Verzeichnissen voller Fotos. Was ich tun möchte, ist, die größeren Größen dieser Fotos zu behalten. Jedes Verzeichnis enthält 31 bis 66 Dateien.
Jedes Verzeichnis verfügt über Miniaturansichten und größere Versionen sowie eine Datei mit dem Namen example.jpg
Ich versandte die example.jpg-Datei einfach mit:
rm */example.jpg
Anfangs dachte ich, dass es einfach wäre, die Thumbnails zu löschen, aber das Problem ist, dass sie nicht einheitlich benannt sind. Das typische Muster war photo1.jpg
und photo1s.jpg
. Ich tat es, rm */photo*s.jpg
aber es endete damit, dass einige der genannten Dateien photoXs.jpg
tatsächlich größer und nicht kleiner waren. Argh.
Ich möchte also jedes Verzeichnis nach Dateigröße durchsuchen und die Miniaturansichten löschen (oder verschieben). Anfangs dachte ich, ich würde nur ls -R
jede Datei und die Größe jeder Datei extrahieren und diese unter einem Schwellenwert speichern. Das Problem? In einem Verzeichnis beträgt die Größe 1,1 MB und der Thumb 200 KB. In einem anderen ist der große 200k und der kleine 30k.
Schlimmer noch, die Dateien haben in Wirklichkeit meistens einen Namen photo1.jpg
- also würde es nicht funktionieren, sie alle in denselben Ordner zu legen, nach Größe zu sortieren und in Gruppen zu löschen, ohne sie bereits umzubenennen. Wenn es möglich ist, würde ich es vorziehen, sie in ihren Ordnern zu belassen.
Ich war fast entschlossen, das alles manuell zu machen, dachte dann aber, ich würde hier fragen.
Wie würden Sie diese Aufgabe erledigen?
quelle
Antworten:
In diesem Skript wird davon ausgegangen, dass zwischen den Gruppen der kleinsten und der größten Datei eine erhebliche Größenlücke besteht. Insbesondere, dass die kleinste der großen Dateien mindestens doppelt so groß ist wie die größte der kleinen Dateien.
Rufen Sie das Skript "imagedirstats" auf und führen Sie es in einer Schleife wie der folgenden aus:
um Dateien in einzelnen Verzeichnissen im Verzeichnisbaum zu finden und zu löschen.
Hier ist das Skript:
Bearbeiten: Die Warnmeldung wurde verschoben, sodass zuerst nützliche Informationen angezeigt werden. Fehlende behoben
fi
.Bearbeiten 2: Die beiden
find
Befehle wurden konsistent gemacht. Auskommentierte Variante für OS X hinzugefügt. Informationen zum Ausführen des Skripts hinzugefügt.quelle
imagedirstats:
und rannte es mit~/bin/imagedirstats */*
und das Ergebnis ist:-bash: /Users/artlung/bin/imagedirstats: Argument list too long
...~/bin/imagedirstats *
find: illegal option -- p find: illegal option -- r find: illegal option -- i find: illegal option -- n find: illegal option -- t find: %s\n: No such file or directory /Users/artlung/bin/imagedirstats: line 38: syntax error: unexpected end of file
find
Befehl bearbeitet habe . Ich habe vergessen, ein-maxdepth
Argument aufzunehmen.find --version
dir Welche Linux Distribution (und Version)?find /path/to/main/branch -type d | while read subdir; do (cd "$subdir" && ~/bin/imagedirstats ); done
Wenn Sie einen bestimmten Ausschnitt finden, zum Beispiel, dass alle großen Bilder größer als 200 KB sind, können Sie dies tun:
find */*.jpg -size -200k -delete
Möglicherweise möchten Sie zuerst eine Sicherungskopie erstellen.
quelle
Wenn die Dateigrößen nicht konsistent sind, sind die Bildabmessungen?
Sie können
identify
ein mit ImageMagick geliefertes Werkzeug verwenden, um die Bildabmessungen zu erfassen. Mit einfachen Bash-Skripten können Sie die Bilder je nach Größe bearbeiten.So erfassen Sie die Breite und Höhe eines Bildes mit
identify
:Sie erhalten eine Ausgabe wie folgt:
Sie können dann das
cut
Dienstprogramm verwenden, um die Zahlen in Ihrem Skript zu erfassen:quelle
if [ $h -lt 200 ] ...
Wenn Sie dies auf der Grundlage des Dateinamens tun möchten, versuchen Sie Folgendes:
Es findet jede .jpg-Datei, setzt ein "s" am Ende des Dateinamens (kurz vor dem ".") Und löscht es.
quelle