Ich versuche, ein sehr einfaches Bash-Shell-Skript zu schreiben, das in einem bestimmten Verzeichnis cd wird, es entfernt alle Dateien und Verzeichnisse außer einigen wenigen ausgewählten und kehrt dann zum ursprünglichen Verzeichnis zurück.
Mein Code ist:
%Vor% Ich habe viele verschiedene Möglichkeiten ausprobiert, um die Symbole ('und' | 'mit einfachen oder doppelten Anführungszeichen oder Backslash zu schreiben, aber nichts hat funktioniert. Beachten Sie, dass shopt -s extglob
und rm !(filename1|filename2) -rf
außerhalb eines Skripts funktionieren.)
Wahrscheinlich begehe ich einen grundlegenden und fundamentalen Bash-Skriptfehler, den ich nicht sehen kann, aber die Erfahrung kommt ...
Irgendwelche Vorschläge !? Vielen Dank im Voraus.
Zwei Probleme, die ich sofort sehen kann:
-rf
Argument für rm
muss vor den Dateinamen !
, (
, |
und )
sollten nicht mit Backslashes versehen werden Versuchen Sie es stattdessen:
%Vor% Wenn es immer noch nicht funktioniert, entfernen Sie das Argument -f
, und Sie erhalten Fehlermeldungen darüber, was schief läuft, anstatt sie still zu unterdrücken. Um den Namen jeder entfernten Datei auszudrucken, können Sie auch die Option -v
hinzufügen.
Wenn Sie eine aktuelle Version von find
haben, verwenden Sie:
Überprüfen Sie die Ausgabe und ersetzen Sie -print
durch -delete
, wenn nur die Dateien gedruckt werden, die Sie wirklich löschen möchten.
Wenn Ihre Version von find
-delete
nicht unterstützt, verwenden Sie -type f -exec rm "{}" \;
Beachten Sie, dass dadurch nur Dateien gelöscht werden. Dies ist wichtig: Wenn Sie sagen, dass die Datei x
beibehalten wird, diese Datei aber in einem Ordner y
ist, wird x
nur ignoriert, um sie später mit dem gesamten Ordner y
zu löschen.
Um alle leeren Ordner loszuwerden (und dabei die Dateien zu behalten, die Sie behalten möchten):
%Vor%(Quelle: So finden und löschen Sie leere Verzeichnisse und Dateien in Unix )
Ich empfehle nicht, eine Regel zu schreiben, die bestimmte Dateien ausnimmt. Was ich wahrscheinlich tun würde, wäre zu versuchen, entweder eine Dateimaske / glob oder einen anderen Anker in den Namen der Dateien zu finden, die Sie entfernen möchten, die die Dateien, die Sie behalten möchten, nicht haben. In den meisten Fällen könnten Sie das wahrscheinlich durch Erweiterung tun. Leider, weil Sie nicht erwähnt haben, was die Namen der Dateien sind, kann ich Ihnen nicht genauer helfen.
So etwas wie zwei (oder mehr) Suchschleifen: -
%Vor%Wenn nicht, suchen Sie nach anderen gemeinsamen Eigenschaften der Dateien. Wenn es keinen gibt, müssen Sie möglicherweise Ihre Dateien umbenennen, um sich einen zu geben. Ich setze immer viele Anker (getrennte Namensfelder, Erweiterungen usw.) in meine Dateinamen, weil ich auf diese Weise viele verschiedene Möglichkeiten habe, das zu tun, was ich mit ihnen brauche. Mein übliches Namensformat ist: -
%Vor%Pluszeichen sind Feldtrennzeichen, Bindestriche sind für Leerzeichen, aber keine Striche als erste oder letzte Zeichen. Alle Kleinbuchstaben und keine Steuerzeichen oder andere nicht alphanumerische Zeichen zulässig. Als Ergebnis kann ich diese mit awk, cut oder was auch immer ich verwenden möchte, schneiden und sie leicht umbenennen. Das Einfügen der Erweiterung am Anfang des Namens bedeutet auch, dass ls nur ein Flag (-l) benötigt, um ein perfekt geordnetes Dateisystem zu erhalten.
Wenn Sie wissen, wie Sie Ihre Verzeichnisstruktur als Datenbank mit den grundlegenden POSIX-Tools verwenden können, müssen Sie manchmal nichts Komplizierteres installieren, um das zu tun, was Sie wollen.
Sie haben ein langes Char-Limit für Dateinamen in UNIX sowie eine Tab-Vervollständigung für das Navigieren in langen Namen. Habe keine Angst, beide großzügig zu nutzen.
vorausgesetzt, Sie haben Dateien:
drwxr-xr-x 2 Wurzelwurzel 4096 Feb 1 02:17 a
drwxr-xr-x 2 Wurzelwurzel 4096 Feb 1 02:17 b
drwxr-xr-x 2 Wurzelwurzel 4096 Feb 1 02:17 c
drwxr-xr-x 2 Wurzelwurzel 4096 Feb 1 02:17 d
drwxr-xr-x 2 Wurzelwurzel 4096 Feb 1 02:17 d
drwxr-xr-x 2 Wurzelwurzel 4096 Feb 1 02:17 f
drwxr-xr-x 2 Wurzelwurzel 4096 Feb 1 02:18 nodelete1
drwxr-xr-x 2 Wurzelwurzel 4096 Feb 1 02:18 nodelete2
Sie könnten tun:
ls | grep -v "nodel.\+" | xargs rm -rf
Verwenden Sie die erweiterte Regexp-Syntax zum Ausschließen von Dateien.
Erläuterung:
ls --- listet das aktuelle Verzeichnis auf (ls -d, um nur Verzeichnisse aufzulisten)
grep -v --- v-Flag gibt an, was NICHT ZUGELASSEN ist + grep erlaubt das Schreiben von perl-Stil regexp, wenn Sie -P Flag
angebenxargs --- wendet die Aktion "rm -rf" auf jedes Element an