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

BaltoStar
quelle
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
Übelsuppe
quelle
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"
lesmana
quelle
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 {} \;
Panthro
quelle
-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.

Mantisimo
quelle
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