Entfernen Sie alle Verzeichnisse innerhalb eines übergeordneten Verzeichnisses mit Ausnahme von eins und seinen Nachkommen

8

Ich möchte das Verzeichnis B und D entfernen. Aber ich möchte C und all seine abgeleiteten Dateien und Verzeichnisse behalten. Wie lautet der Befehl zum Entfernen aller untergeordneten Verzeichnisse eines übergeordneten Verzeichnisses mit Ausnahme eines Verzeichnisses und seiner untergeordneten Verzeichnisse?

Hilfe geschätzt.

    
Joe Saad 29.07.2016, 23:33

4 Antworten

6

Was Sie wollen, ist dieser Befehl:

find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;

Demo:

# List what's inside directory we want to remove
$ ls
file1  file2  keepMe/  removeA/  removeB/
# Testing what find gives without removing
$ find ~/TESTDIR -mindepth 1 -type d -not \( -name "keepMe" \)               
/home/xieerqi/TESTDIR/removeA
/home/xieerqi/TESTDIR/removeB
# Actual removal and testls
$ find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;
$ ls
file1  file2  keepMe/

Erklärung:

  • find DIRECTORY call find Befehl, um auf DIRECTORY
  • zu operieren
  • -mindepth 1 : Arbeitet nur mit dem Inhalt des Verzeichnisses, vermeiden Sie das Verzeichnis selbst, welches die Ebene 0 ist
  • -maxdepth 1 : verhindert das Absteigen in Unterverzeichnisse ( rm -rf ist trotzdem rekursiv, daher müssen wir nicht in Unterverzeichnisse absteigen, um sie zu entfernen)
  • -type d : Suche nur nach Verzeichnissen
  • -not \( -name "keepMe" \) ignoriere das Element mit dem Namen, den du behalten möchtest
  • -exec rm -rf {} \; führt die Entfernung für jedes gefundene Objekt durch
Sergiy Kolodyazhnyy 29.07.2016, 23:40
8

Unter Verwendung der erweiterten Glob Features der bash-Shell (die in aktuellen Ubuntu-Installationen standardmäßig aktiviert sind)

$ tree A
A
├── B
├── C
│   ├── ac1
│   └── ac2
└── D

5 directories, 0 files

Sie können alles mit Ausnahme von C und seines Inhalts mit dem Glob-Ausdruck A/!(C) i.e.

adressieren
$ echo A/!(C)
A/B A/D

Also entfernen alles außer dem Verzeichnis C und seinem Inhalt können Sie einfach

verwenden
rm -rf A/!(C)

verlassen

$ tree A
A
└── C
    ├── ac1
    └── ac2

3 directories, 0 files
    
steeldriver 30.07.2016 00:58
5

Ein einfacher Weg wäre trash-cli zu verwenden

Sie können es mit sudo apt-get install trash-cli

installieren

Einmal installiert, können Sie mit cd /A zum übergeordneten Verzeichnis A navigieren und dann den Befehl ausgeben trash B D , wobei B und D die Verzeichnisse sind, die Sie entfernen möchten (sie landen im Papierkorb des Laufwerks, auf dem sie sich befinden. Wenn Sie einen Fehler machen, können Sie die Dateien wiederherstellen)

Getestet unter Ubuntu 16.04 und 14.04

    
Elder Geek 29.07.2016 23:45
4

Verwenden Sie einfach die for -Schleife und test von Bash, um die gewünschten Verzeichnisse zu filtern, und den Befehl rm -rf , um Verzeichnisse wie folgt rekursiv zu löschen:

for x in /path/to/parent/*; do test "$x" != "dir_survive" && rm -rf "$x"; done

Dies iteriert über alle Elemente (Dateien und Verzeichnisse) innerhalb von /path/to/parent/ und löscht das Element rekursiv, wenn sein Name nicht gleich dir_survive ist. Wenn das übergeordnete Verzeichnis das aktuelle Verzeichnis ist, können Sie nur * als Pfad schreiben.

Wenn Sie unsicher sind und testen möchten, welche Elemente zuerst gelöscht werden, ohne etwas zu tun, ersetzen Sie einfach rm -rf im obigen Befehl durch echo und es werden nur die Löschkandidaten ausgegeben.

Hier ist ein Beispiel:

$ tree
.
├── dir1
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
│       ├── file1
│       └── file2
├── dir2
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
│       ├── file1
│       └── file2
└── dir_survive
    ├── subdir1
    │   ├── file1
    │   └── file2
    └── subdir2
        ├── file1
        └── file2

9 directories, 12 files

$ for x in *; do test "$x" != "dir_survive" && rm -rf "$x"; done

$ tree
.
└── dir_survive
    ├── subdir1
    │   ├── file1
    │   └── file2
    └── subdir2
        ├── file1
        └── file2

3 directories, 4 files
    
Byte Commander 30.07.2016 00:09