In einem Script pflege ich Dateitypen (-extensions), die ich innerhalb eines Ordners löschen möchte. Das mache ich deswegen, weil eben nicht alle Dateien gelöscht werden sollen.
Irgendwie ist das aber lästig. Und wie ich feststellen konnte, auch komplett unsinnig. Es geht einfacher, denn die Anzahl der Dateitypen, die ich halten möchte, ist überschaubar und ändert sich in der Regel nicht. Daher:
Löschen aller Dateien, aber ohne das Muster!
Der einfachste Weg, um z.B. alle Dateien, außer *.jpg, zu löschen, ist folgender:
rm $(ls -I "*.jpg")
Zu beachten:
Die Option hinter dem ls
ist das „große i“ für ignore.
Sofern mehrere Dateitypen ausgenommen werden sollen, müssen diese aufgelistet werden (mit jeweils vorangestellter Option -I
):
rm $(ls -I "*.jpg" -I "*.jpeg" -I "*.png")
Wenn im Falle der Befehlsausführung in der Konsole einer der Dateitypen nicht vorhanden ist, kann er nicht von ls aufgelistet werden. Zudem, sofern in dem Ordner noch Unterordner vorhanden, können diese mit dem einfachen rm-Befehl nicht gelöscht werdne. Somit wird dann eine Standardfehlerausgabe erzeugt. In etwa so:
ls: Zugriff auf ‚*.jpeg‘ nicht möglich: Datei oder Verzeichnis nicht gefunden
oder
rm: das Entfernen von ‚archiv‘ ist nicht möglich: Ist ein Verzeichnis
Das ist nicht weiter schlimm, kann aber lästig sein. Die Standardfehlerausgabe kann man unterdrücken, indem man sie umleitet:
rm $(ls -I "*.jpg" -I "*.jpeg" -I "*.png") 2>/dev/null
Mit der Umleitung der Standardfehlerausgabe aber vorsichtig sein, denn andere Hinweise aus der Befehlsabarbeitung werden damit auch umgeleitet und sind nicht sichtbar, sofern man nicht noch andere Vorkehrungen getroffen hat.
Es gibt noch reichlich andere Möglichkeiten, beim Löschen von Dateien Ausnahmen zu setzen. Die von mir nun gewählte Variante ist für mich die einfachste, denn mit den Befehlen ls und rm gehe ich tagtäglich um. Diese sind mir deswegen insgesamt in ihrer Bedeutung wohl bekannt.
Verfasst von Bommo
Noch keine Reaktion