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 a
Ordner, b
Ordner und x
Datei 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, GLOBIGNORE
um 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 find
aus dem NASA
Verzeichnis 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 extglob
es nicht eingeschaltet ist, aktivieren Sie es zuerst:
shopt -s extglob