Bash-Skript zum Entfernen aller Dateien und Verzeichnisse außer bestimmten

8

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.

    
mario go 05.11.2013, 05:18
quelle

5 Antworten

7

Zwei Probleme, die ich sofort sehen kann:

  • Das -rf Argument für rm muss vor den Dateinamen
  • sein
  • Die extglob-Spezifizierer ! , ( , | 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.

    
Adam Rosenfield 05.11.2013 05:33
quelle
3

Wenn Sie eine aktuelle Version von find haben, verwenden Sie:

%Vor%

Ü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 )

    
Aaron Digulla 05.11.2013 08:06
quelle
0

Versuchen Sie es unten:

%Vor%

Viel Glück!

    
Nancy 05.11.2013 07:52
quelle
0

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.

    
petrus4 05.11.2013 10:37
quelle
0

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

angeben

xargs --- wendet die Aktion "rm -rf" auf jedes Element an

    
Mr. BeatMasta 31.01.2014 18:30
quelle

Tags und Links