Praxis | Terminal | Hermann Apfelböck | 4/2025 | 30. Mai 2025

Lösch-Scripts für Ordner und Dateien

Die eingebauten und delegierenden Löschoptionen von Find sind beeindruckend. Aber sie sind entweder riskant oder erfordern viel Disziplin bei der Bestätigung vieler Dateiobjekte. Hinzu kommt immer die katastrophale Fehlermöglichkeit, dass eine Löschaktion im falschen Verzeichnis gestartet wird. Vier Script-Lösungen auf Heft-DVD haben Find als Basistool, arbeiten aber entweder etwas sicherer oder etwas komfortabler. 

Script delfile.all in Aktion: Das Script löscht zwar wie „find -delete“ ohne Einzelabfragen alles Angeforderte, zeigt aber vorher die Dateiliste an.

Die Bash-Scripts löschen Ordner (deldir) oder Dateien (delfile) mit einem bestimmten Namen oder einer Namensmaske wie „*.zip“. Die kontrollierten Varianten mit Einzelbestätigung nennen sich „deldir.ctl“ und „delfile.ctl“. Sie haben gegenüber den Optionen von Find den Vorteil, dass das Startverzeichnis bestätigt werden muss, dass als Bestätigungstaste „j“ (ohne Eingabetaste) genügt und irreführende Fehlermeldungen entfallen. Die radikaleren Varianten „deldir.all“ und „delfile.all“ haben den Vorzug, dass die komplette Liste der zu löschenden Objekte vorab angezeigt wird. Bevor Sie mit „YES“ wirklich löschen, ist also Gelegenheit zu einer Kontrolle. 

In der Annahme, dass man solche Löschaktionen nicht täglich benötigt, wird es genügen, die Scripts etwa ins Home zu kopieren und mit (Beispiel)

bash ~/deldir.all 

zu starten. Vor diesem Aufruf muss mit cd in das gewünschte Startverzeichnis navigiert werden. 

Achtung: Die Scripts sollen große Löschaktionen verbessern, aber nicht dazu animieren: Auch hier muss jeder wissen, wo und mit welchen Dateimasken er arbeitet!

Vier Lösch-Scripts auf Heft-DVD (unter „Software“)
deldir.ctl, deldir.all, delfile.ctl, delfile.all

Anmerkungen zu den Scripts

Wer ohne Profikenntnisse kleine Scrip-Aaktionen wie die oben vorgestellten realisiert, erlebt regelmäßig Überraschungen. Mindestens zwei Hürden hatten auch wir zu überwinden, und diese sollen nicht unkommentiert bleiben, da die Erläuterung auch in ähnlich gelagerten Fällen helfen kann.

Was bedeutet die Variable IFS,und warum wird sie in diesen Scripts genutzt? IFS steht für „Input Field Separator“ und kann je nach Eingabedaten passend definiert werden. Typische Feldbegrenzer sind etwa Komma, Strichpunkt, Doppelpunkt oder Leerzeichen. Mit 

IFS=$'\n'

stellen die Scripts aber ganz im Gegenteil klar, dass es in der Inputdatei mit den Pfadnamen keine „Felder“ gibt, sondern ausschließlich der Zeilenumbruch („\n“) eine Eingabeeinheit markiert. Dies ist beim Einlesen mit der For-Schleife notwendig, weil For bei Pfaden mit Leerzeichen automatisch Feldbegrenzer erkennen will und daher die Pfadeingabe in Einzelteile zerlegen würde. 

Alle vier Bash-Scripts auf Heft-DVD folgen im Prinzip diesem Muster. Hier handelt es sich um die Löschaktion für Ordner mit interaktiver Bestätigung („deldir.ctl“).

Leser mit Script-Erfahrung können nun in Frage stellen, warum statt For nicht besser While (read) genutzt wird. „while read“ eignet sich zum Zeileninput eigentlich besser, weil es immer eine ganze Zeile als Eingabeeinheit übernimmt. Der Einwand ist legitim. Aber wenn „while read“ den Read-Befehl nutzt, ist nach unserer Kenntnis innerhalb dieser Schleife keine interaktive Read-Abfrage wie 

read -n 1 -p "$ORDNER (j-n)? "  yesno

möglich. Die Frage würde innerhalb der „while read“-Schleife einfach ignoriert.