Unterordner löschen, ohne den übergeordneten Ordner zu löschen


15

Für diese Art von Verzeichnisstruktur:

/config/filegroups/filegroupA/files/fileA1.txt
/config/filegroups/filegroupA/files/fileA2.txt
/config/filegroups/filegroupB/files/fileB1.txt
/config/filegroups/filegroupB/files/fileB2.txt
...

Ich weiß, dass ich mit rm -rf /config/filesgroupsdem übergeordneten Ordner und allen Unterordnern löschen kann ...

aber ich möchte nur löschen /filegroupA, /filegroupBetc., und nicht löschen/config/filegroups


13
Gibt es ein Problem bei der Verwendung von rm -rf / config / filesgroups / *?
dsmsk80

3
Oder vielleicht sogar rm -rf /config/filegroups/filegroups{A,B}?
Drav Sloan

@dsumsky Standardmäßig bashist '.' nicht enthalten. Ordner in der Pfadnamenerweiterung. Welche kann oder kann nicht erwünscht sein. Myself ich shopt -s dotglobin .bashrczu beheben , dass. Nur eine Randnotiz, die jemand nützlich finden könnte;).
Miroslav Koškár

Hat irgendetwas für Sie gearbeitet? Wenn ja, würde es Ihnen etwas ausmachen, eine Antwort zu akzeptieren, um anderen (wie mir) zu helfen, die dasselbe tun möchten?
Laut Mawg wird Monica

rm -rf /*wird tun;) --- ernsthaft nicht tun
Muhammad Umer

Antworten:


28
rm -rf /config/filegroups/*

Wenn Sie nur Verzeichnisse (und Symlinks zu Verzeichnissen) löschen möchten, ohne dass Dateien /config/filegroupsberührt werden, können Sie einen abschließenden Schrägstrich verwenden:

rm -rf /config/filegroups/*/

Wenn Sie Verzeichnisse mit Namen löschen möchten, die ebenfalls mit einem beginnen ., sollten Sie die dotglob-Shell-Option verwenden:

shopt -s dotglob
rm -rf /config/filegroups/*/
shopt -u dotglob

und bitte nicht, dass es nicht funktioniert für rm -rf "/ config / filegroups / *"
Ilya Yevlampiev

5

Dadurch werden alle Dateien und Verzeichnisse unter /config/filegroupseinschließlich "versteckter" Dateien und Verzeichnisse (Namen beginnend mit .) gelöscht .

find /config/filegroups -mindepth 1 -maxdepth 1 | xargs rm -rf

Wenn die Datei- oder Verzeichnisnamen Leerzeichen enthalten, müssen Sie dies folgendermaßen tun:

find /config/filegroups -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf

Bonus: Sie können zunächst überprüfen, was wie folgt gelöscht wird:

find /config/filegroups -mindepth 1 -maxdepth 1

Wenn Sie bestimmte Dateien oder Verzeichnisse behalten möchten, können Sie dies folgendermaßen tun:

find /config/filegroups -mindepth 1 -maxdepth 1 -not -name "keep"

Gibt es einen Grund , nicht zu verwenden , find‚s - -deleteOption?
Übelsuppe

4
-deleteweigert sich, nicht leere Verzeichnisse zu löschen. -maxdepthÜberschreibungen -depth, die erforderlich sind -delete, um nicht leere Verzeichnisse zu löschen. Ohne können -maxdepthSie nicht leicht erkennen, welche Verzeichnisse gelöscht werden, da auch die Dateien in den Verzeichnissen aufgelistet werden. Nicht verwenden -maxdepthbedeutet auch, dass Sie Filter wie nicht einfach verwenden können -name. Außerdem werden -deletedie Verzeichnisse gelöscht, indem zuerst alle darin enthaltenen Objekte gelöscht werden. Dies kann bei großen und tiefen Bäumen sehr lange dauern.
Lesmana

4

Ich bevorzuge die Verwendung von findmit -exec, das würde Ihren Anruf in etwa so machen:

find /config/filegroups/ -maxdepth 1 -mindepth 1 -type d -exec rm -rf {} \;

-2

Wenn Sie sich bereits im Ordner befinden, können Sie einfach eingeben rm -rf ./**

So:

cd /config/filesgroups
rm -rf ./**

Dies ist ein Glob-Muster zum Löschen aller Unterordner aus dem lokalen Pfad.

./Beziehen sich auf den lokalen Ordner ... und **auf alle Ordner darunter.


1
Welcher Ordner, und warum "**"
RalfFriedl

1
Dies ist genau das Gleiche wie rm -rf ./*, mit der Ausnahme, dass Sie wahrscheinlich Diagnosemeldungen zu "Keine solche Datei oder kein solches Verzeichnis" erhalten, wenn Sie es nicht -fin Ihrem Befehl verwenden (da das oberste Verzeichnis rekursiv gelöscht würde, bevor sein Inhalt verarbeitet wird von rm).
Kusalananda
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.