Ich möchte Verzeichnis B und D entfernen. Aber ich möchte C und alle seine untergeordneten 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.
filesystem
directory
directory-structure
Joe Saad
quelle
quelle
A
in Ihrem Beispiel)? Löschen Sie sie auch oder behalten Sie sie?Antworten:
Was Sie wollen, ist dieser Befehl:
Demo:
Erläuterung:
find DIRECTORY
Rufen Sie den Befehl find auf, um DIRECTORY zu bearbeiten-mindepth 1
: Arbeiten Sie nur mit dem Inhalt des Verzeichnisses. Vermeiden Sie das Verzeichnis selbst auf Ebene 0-maxdepth 1
: verhindert das Absteigen in Unterverzeichnisse (rm -rf
ist ohnehin rekursiv, sodass wir nicht in Unterverzeichnisse absteigen müssen, um sie zu entfernen)-type d
: Suche nur nach Verzeichnissen-not \( -name "keepMe" \)
Element mit dem Namen ignorieren, den Sie behalten möchten-exec rm -rf {} \;
Entfernen Sie jedes gefundene Objektquelle
find
ist ein guter Freund hier, aber Bash istfor
undtest
sind bessere Freunde ...>: - DVerwendung der erweiterten Glob- Funktionen der Bash-Shell (die in aktuellen Ubuntu-Installationen standardmäßig aktiviert sind)
Sie können alles außer
C
und seinen Inhalt mit dem glob-Ausdruck adressieren,A/!(C)
dhUm also alles außer dem Verzeichnis
C
und seinem Inhalt zu entfernen , können Sie es einfach verwendenVerlassen
quelle
('"
wenn ich es remote über ausführessh $VM_ADDRESS "rm -rf $APP_FOLDER/!(node_modules)"
. Irgendwelche Ideen? Vielen Dank.extglob
Shell - Option ist nur für interaktiven Shells aktiviert - nicht sicher , ob Sie zwingen können ,ssh
das zu tunEine einfache Möglichkeit wäre die Verwendung von trash-cli
Sie können es mit installieren
sudo apt-get install trash-cli
Nach der Installation können Sie mit zum übergeordneten Verzeichnis A navigieren
cd /A
und dann den Befehl eingeben,trash B D
bei dem B und D die Verzeichnisse sind, die Sie entfernen möchten (sie landen im Papierkorb des Laufwerks, auf dem sie sich befinden. Wenn Sie also einen Fehler machen, können Sie dies tun Dateien wiederherstellen)Getestet unter Ubuntu 16.04 und 14.04
quelle
trash ! C
?trash: cannot trash non existent
! '`extglob
.Verwenden Sie einfach die Bash-
for
Schleife undtest
filtern Sie die gewünschten Verzeichnisse und denrm -rf
Befehl zum rekursiven Löschen von Verzeichnissen wie folgt:Dies durchläuft alle Elemente (Dateien und Verzeichnisse) im Inneren
/path/to/parent/
und löscht das Element rekursiv, wenn sein Name nicht gleich istdir_survive
. Wenn das übergeordnete Verzeichnis das aktuelle Verzeichnis ist, dürfen Sie nur*
als Pfad schreiben .Wenn Sie sich nicht sicher sind und testen möchten, welche Elemente zuerst gelöscht werden, ohne etwas zu unternehmen, ersetzen Sie einfach das
rm -rf
im obigen Befehl angegebene durchecho
und es werden nur die Löschkandidaten ausgegeben.Hier ist ein Beispiellauf:
quelle