staging.inyokaproject.org

Bilder mit 120x120 Pixeln löschen

Status: Gelöst | Ubuntu-Version: Ubuntu 20.10 (Groovy Gorilla)
Antworten |

salim13

Anmeldungsdatum:
17. April 2021

Beiträge: Zähle...

EDIT: Falsches Unterforum. Sorry. ☹

Moderiert von ChickenLipsRfun2eat:

Thema in einen passenden Forenbereich verschoben. Bitte beachte die als wichtig markierten Themen („Welche Themen gehören hier her und welche nicht?“) in jedem Forenbereich. Danke.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Man muss man eigentlich nur dafür sorgen, dass die Auflösung nicht Teil dessen ist, was von grep weitergegeben wird - dazu kann man Reguläre Ausdrücke in PCRE-Syntax nutzen:

1
find . -iname "*.jpg" -type f -exec identify -format '%i %wx%h\n' '{}' \; | grep -Po '.*(?=\s120x120)' | xargs rm

Mit python3-pil könnte man z.B. auch sowas machen - das hat für mich den Vorteil, dass es plattformübergreifend nutzbar ist und expliziter da steht, was das Skript tut:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/usr/bin/env python3
import pathlib
import sys
from PIL import Image

for p in sys.argv[1:]:
    path = pathlib.Path(p)
    for img_path in path.rglob('*.jpg'):
        if not img_path.is_file():
            continue
        with Image.open(img_path) as img:
            size = img.size
        if size == (120, 120):
            img_path.unlink()

Dem Skript übergibt man dann den oder die Ordner als Argument, die man rekursiv durchsuchen lassen möchte.

salim13

(Themenstarter)

Anmeldungsdatum:
17. April 2021

Beiträge: Zähle...

Hi,

bin grade am sortieren meiner Bilder und hatte vor, sämtliche JPGs mit 120x120 Pixel zu löschen. Jedoch stehe ich auf dem Schlauch und weiß grad nicht, wie ich den Output von meinem Command zu rm pipen kann..

1
find . -iname "*.jpg" -type f -exec identify -format '%i %wx%h\n' '{}' \; | grep '120x120'

Jemand eine Lösung parat?

Moderiert von ChickenLipsRfun2eat:

Das Thema ist mit diesem zusammengeführt worden. Bitte erstelle nur ein Thema pro Fragestellung!

schollsky

Anmeldungsdatum:
3. Dezember 2012

Beiträge: 1730

Hallo salim,

ich hab noch keine Lösung, aber mal ein paar Hinweise zum Nachdenken:

Warum gibst Du den Parameter -type f an? Das sollte eigentlich überflüssig sein.

Ausserdem sollte am Ende der Pipe der Löschbefehl stehen.

Ggf. würde ich das ganze vorher testen, bevor Du es auf Dein System loslässt.

Good luck!

Stefan

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

schollsky schrieb:

Warum gibst Du den Parameter -type f an? Das sollte eigentlich überflüssig sein.

Nee, wieso? Man will ja keine Verzeichnisse bearbeiten. Und es ist immerhin möglich, auch einen Verzeichnisnamen mit ".jpg" enden zu lassen.

Ausserdem sollte am Ende der Pipe der Löschbefehl stehen.

Es gibt auch einen anderen Ansatz: find um die Namen zu ermitteln und dann eine Schleife laufe lassen:

1
2
3
find -type f -iname \*.jpg -exec sh -c 'for f; do
  [ $(identify -format '%wx%h' "$f") = 120x120 ] && rm -v "$f"
done' -- {} +

Nachteil ist natürlich, dass der indentify für jede Datei einzeln aufgerufen wird.

Die Lösung von seahawk würde ich so modifizieren:

1
find -iname \*.jpg -type f -exec identify -format '%wx%h %i\n' {} + | sed -ne 's#^120x120 ##p' | xargs -rd \\n rm -v

Wesentliche Unterschiede:

  • identify wird nicht ein Mal pro Datei sondern für mehrere Dateien ausgeführt.

  • sed wird gleichzeitig zu Selektieren der Dateien und zum Entfernen der Größenangabe genutzt

  • xargs ruft den Befehl nicht auf, wenn keine Dateinamen gefunden werden ("-r") und trennt am Zeilenende und nicht bei Whitespace ("-d \\n"). Das ist etwas sicherer:

1
2
3
4
5
$ echo 111 222 | xargs printf '%s\n'
111
222
$ echo 111 222 | xargs -d \\n printf '%s\n'
111 222
Antworten |