Alle Dateien außer den angegebenen Dateien / Ordnern über die Befehlszeile löschen?

7

Ich habe einen Ordner mit vielen Ordnern und verschiedenen Dateien mit den folgenden Strukturen:

NASA

├── a
   ├── doc1
   ├── doc2
   ├── doc3
   ├── folder1
   └── folder2

├── b
   ├── doc1
   ├── doc2
   ├── doc3
   ├── folder1
   └── folder2

├── c
   ├── doc1
   ├── doc2
   ├── doc3
   ├── folder1
   └── folder2

├─ x
├─ y
└─ z     

Ich möchte den Inhalt des Ordners ( NASA/) mit Ausnahme der angegebenen Ordner und Dateien löschen .

Zum Beispiel möchte ich aOrdner, bOrdner und xDatei behalten .

Ich habe diese Lösung ausprobiert :

 rm !(a/) -r NASA/

Und (wie in der Antwort hier erklärt ):

find NASA/ -type f ! -iname "x" -delete

Aber das ist nicht sehr einfach und ich muss ein Bash-Skript verwenden.

Vermisse ich einen einfacheren Weg? Wie kann ich das in einem einzigen Befehl tun?

hg8
quelle
Ich denke, die Angabe der Dinge, die Sie löschen möchten , ist keine Option, oder? wierm -r c y z
Wayne_Yux
@ Wayne_Yux In der Tat ist das nicht möglich, ich habe wie 1000 Dateien / Ordner mit zufälligen Namen ...
hg8

Antworten:

17

Sie können verwenden GLOBIGNORE, um die Namen festzulegen, die beim Globbing ignoriert werden, und um dann *alle anderen Dateien / Verzeichnisse abzugleichen :

GLOBIGNORE='a:b:x'; rm -r *

Beispiel:

$ tree 
.
├── a
   ├── 1
   ├── 2
   └── 3
├── b
   ├── 1
   ├── 2
   └── 3
├── c
   ├── 1
   ├── 2
   └── 3
├── x
├── y
└── z

/NASA$ GLOBIGNORE='a:b:x'

/NASA$ rm -r *

/NASA$ tree 
.
├── a
   ├── 1
   ├── 2
   └── 3
├── b
   ├── 1
   ├── 2
   └── 3
└── x

Alternativ können Sie findaus dem NASAVerzeichnis Folgendes verwenden:

find . -maxdepth 1 ! -name '.' ! -regex '.*/\(a\|b\|x\)$' -exec rm -r {} +

Beispiel:

/NASA$ tree 
.
├── a
   ├── 1
   ├── 2
   └── 3
├── b
   ├── 1
   ├── 2
   └── 3
├── c
   ├── 1
   ├── 2
   └── 3
├── x
├── y
└── z


/NASA$ find . -maxdepth 1 ! -name '.' ! -regex '.*/\(a\|b\|x\)$' -exec rm -r {} +


/NASA$ tree 
.
├── a
   ├── 1
   ├── 2
   └── 3
├── b
   ├── 1
   ├── 2
   └── 3
└── x
heemayl
quelle
17

Sie können das erweiterte Globbing verwenden, aber das Ausrufezeichen steht vor dem Muster:

rm -rf NASA/!(a|b|x)

Wenn extglobnicht eingeschaltet, aktivieren Sie es zuerst:

shopt -s extglob
Choroba
quelle
Das hat bei mir funktioniert.
WM