Entfernen Sie alle Dateien rekursiv, ohne Verzeichnisse zu löschen

9

Ich möchte alle Dateien eines Verzeichnisses "bereinigen", einschließlich aller Dateien in Unterverzeichnissen, aber ich möchte die Unterverzeichnisse an Ort und Stelle belassen. Ich verstehe, rm -rdass dadurch auch die Unterverzeichnisse selbst gelöscht werden.

Ich möchte keine versteckten (Punkt-) Dateien löschen.

Wie kann das gemacht werden?

Scott Wilton
quelle
1
find -type f ! -name "[.]*" -deleteist nicht geeignet?
Costas
Ich weiß es nicht. Tut das was ich verlange?
Scott Wilton
Versuchen Sie es ohne -delete- es werden nur Dateinamen gedruckt, um sie zu löschen.
Costas
Möchten Sie Dateien (versteckt oder nicht) in versteckten Verzeichnissen löschen?
Stéphane Chazelas
Was ist mit Symlinks zu Verzeichnissen?
Stéphane Chazelas

Antworten:

10

Verwenden Sie finddafür:

find . ! -name '.*' ! -type d -exec rm -- {} +
jimmij
quelle
1
Nicht alle Find-Implementierungen haben-delete
wurtel
2
@ RomeoNinov bitte lesen OP Frage:I do not want to delete hidden (dot) files.
jimmij
1
@Costas, nein, es gibt keine Shell, die entkommen muss +(zumindest nicht in den Familien Bourne, csh oder rc). Es gibt eine Legende, die besagt, dass einige alte Versionen der csherforderlichen Flucht, {}aber ich bin nie auf diese gestoßen.
Stéphane Chazelas
1
@ScottWilton Versteckte Verzeichnisse sind enthalten, versteckte Dateien in versteckten Verzeichnissen jedoch nicht. Wenn Sie alle Dateien in versteckten Verzeichnissen ablehnen möchten, find . ! -name '.*' ! -type d ! -path '*/.*'sollten Sie den Job erledigen.
Jimmyij
1
@ Jimmy, eher find . -name '.?*' -prune -o ! -type d -exec rm {} +vermeiden, in diesen insgesamt abzusteigen. Beachten Sie, dass --dies hier nicht erforderlich ist (schadet jedoch nicht), da Pfade mit beginnen ./.
Stéphane Chazelas
0

versuchen Sie etwas wie:

find <path> ! -name '.*' -type f -exec rm {} \;
Romeo Ninov
quelle
Gibt es einen Grund, die Dateien einzeln zu entfernen, anstatt die Arbeit zu beschleunigen .... -exec rm {} + ?
Anthon
Ich mache die Dinge lieber einzeln. Massenoperationen (und parallele Operationen) haben einige seltsame (und unangenehme) Nebenwirkungen (da sie das E / A-Subsystem stark belasten)
Romeo Ninov
1
-exec rm {} +ist nicht parallel, es ruft nur rmmit mehreren Dateinamen auf. Es werden weniger rmAufrufe ausgeführt und sind daher ressourcenschonender. Wenn es etwas weniger sicher ist, vergrößert es das Race-Fenster, in dem eine Verzeichniskomponente der zu entfernenden Dateien in einen Symlink geändert werden kann. Aber nur -deleteoder -execdir rm {} \;würde das voll ansprechen.
Stéphane Chazelas
@ StéphaneChazelas, keines davon (-delete oder -execdir) existiert unter UNIX. Und ich sehe nicht in Frage, Linux erwähnt zu werden!
Romeo Ninov
@ RomeoNinov, ja, ich sagte in einem anderen Kommentar hier, dass nur -execStandard ist. -deleteund -execdirvon BSDs kommen, fügte GNU sie etwa 10 Jahre später hinzu. Auf jeden Fall hat das nichts mit Linux zu tun, das nur ein Kernel ist.
Stéphane Chazelas