Was ist der Befehl zum Entfernen aller Dateien, aber nicht der Verzeichnisse?


23

Nehmen wir an, ich habe einen Verzeichnisbaum wie diesen:

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

Wenn ich es verwende rm -r FOLDER/*, wird alles in FOLDER gelöscht, einschließlich der Unterverzeichnisse. Wie kann ich alle Dateien in FOLDER und seinen Unterverzeichnissen löschen, ohne die tatsächlichen Verzeichnisse zu löschen?

Antworten:


37

Was Sie versuchen, ist das rekursive Löschen. Dafür benötigen Sie ein rekursives Tool, wie z find.

find FOLDER -type f -delete

13

Mit bash:

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

Hier wird über die globalen erweiterten Dateinamen iteriert und nur Dateien entfernt.

Wenn Sie mit den durchzuführenden Änderungen zufrieden sind, entfernen Sie Folgendes, um es echotatsächlich zu entfernen:

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

Schließlich nicht gesetzt globstar:

shopt -u globstar

Mit zsh, Glob Qualifier nutzen:

echo -- FOLDER/**/*(.)

(.) ist das Glob-Qualifikationsmerkmal, das die Glob-Erweiterungen auf normale Dateien beschränkt.

Das Obige druckt nur die Dateinamen, um sie tatsächlich zu entfernen:

rm -- FOLDER/**/*(.)

2
+1 für zsh globbing. Mehr Leute sollten sich der großartigen Dinge bewusst sein, die zsh tun kann.
März

11

Wenn Ihre Version von findnicht unterstützt -delete, können Sie Folgendes verwenden, um alle Dateien im aktuellen Verzeichnis und darunter zu löschen.

find . ! -type d -exec rm '{}' \;

-exec rm {} +wäre schneller, vor allem wenn es viele dateien gibt.
muru

Und find . ! -type d -exec rm {} +entfernt auch Sym-Links.
Gerechtigkeit für Monica

1
@muru: Wenn eine bestimmte Implementierung von findnicht unterstützt wird -delete, unterstützt sie wahrscheinlich auch nicht -exec ... {} +. Der empfohlene Weg, damit umzugehen, ist find ... -print0 | xargs -r0 rm(wenn man viele mögliche Übereinstimmungen erwartet).
David Foerster

5
@DavidFoerster eigentlich nicht. -exec ... {} +ist POSIX, ist es aber -deletenicht. ( -print0
Übrigens auch nicht

@muru: Fair genug. Ich bin auf mindestens zwei Nicht-POSIX- findImplementierungen gestoßen , die unterstützt werden, -print0aber nicht -exec ... {} +(ich erinnere mich jedoch nicht daran -delete). Einer war unter OS X, der andere unter Solaris (vor einigen Jahren auf einem sehr konservativ aktualisierten System). Sie können auch ersetzen -print0mit -printf '%p\0'. Wie auch immer, dies ist Ask Ubuntu und nicht Unix & Linux und Ubuntu benutzt GNU find seit Ewigkeiten.
David Foerster
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.