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

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

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.

Ich möchte beispielsweise aOrdner, bOrdner und xDatei behalten.

Ich habe es versuchtdiese Lösung :

 rm !(a/) -r NASA/

Und (wie in der Antwort erklärtHier):

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

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

Übersehe ich einen einfacheren Weg? Wie kann ich dies mit einem einzigen Befehl tun?

Antwort1

Sie können verwenden, GLOBIGNOREum die Namen festzulegen, die beim Globbing ignoriert werden, und diese dann *für alle anderen Dateien/Verzeichnisse verwenden:

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

Antwort2

Sie können das erweiterte Globbing verwenden, aber das Ausrufezeichen gehtVordas Muster:

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

Wenn extglobes nicht eingeschaltet ist, aktivieren Sie es zuerst:

shopt -s extglob

verwandte Informationen