rm -rf /some/path/*
löscht alle nicht versteckten Dateien in diesem Verzeichnis (und Unterverzeichnissen).
rm -rf /some/path/.*
löscht alle versteckten Dateien in diesem Verzeichnis (aber nicht in Unterverzeichnissen) und gibt außerdem den folgenden Fehler / die folgende Warnung aus:
rm: cannot remove directory: `/some/dir/.'
rm: cannot remove directory: `/some/dir/..'
Was ist der richtige Weg, um alle versteckten und nicht versteckten Dateien und Ordner in einem Zielverzeichnis rekursiv zu entfernen, ohne die Warnung / den Fehler über .
und zu erhalten ..
?
rm ..?* .[!.]*
sollte es tun).*
stimmt mit allen Nicht-Punkt-Dateien.[!.]*
überein , stimmt mit allen Punkt-Dateien außer.
und mit Dateien, deren Name mit beginnt..
, und..?*
stimmt mit allen Punkt-Punkt-Dateien außer überein..
. Zusammen stimmen sie mit allen Dateien außer.
und überein..
. Wenn eines dieser drei Muster mit nichts übereinstimmt, dehnt es sich zu sich selbst aus.rm -f
kümmert sich nicht um nicht vorhandene Argumente, das ist also egal.Sie können auch verwenden
find
. Dies ist komplexer, hat aber den Vorteil, dass es auch dann funktioniert, wenn es so viele Dateien gibt, dass die obigen Platzhalterzeichen über die Befehlszeilenlängenbeschränkung Ihres Systems hinausgehen.Möglicherweise ist es übersichtlicher, das Verzeichnis zu entfernen und neu zu erstellen. Dies hat den Vorteil (bzw. den Nachteil), dass ein leeres Verzeichnis erstellt wird, selbst wenn ein anderes Programm gleichzeitig Dateien im ursprünglichen Verzeichnis erstellt.
quelle
find
Alternative gibt "Erfolg" zurück, auch wenn eine Datei nicht erfolgreich gelöscht wurde. Nicht gut für Drehbuch.find
Befehl heißt es in der Manpage für find: "Da -delete -depth impliziert, können Sie -prune und -delete nicht sinnvoll zusammen verwenden." - doch benutzt du-prune -delete
?-prune
macht hier nichts. Und beim Zurücklesen sehe ich, dass ich die Frage nicht richtig beantwortet habe: Ich habe darauf geachtet, nicht zu rekursiv zu werden, aber die Frage fordert ausdrücklich zum rekursiven Löschen auf. Ich habe meine Antwort korrigiert..[^.]*
anstelle von schreiben,.[!.]*
wenn die Verlaufssubstitution aktiviert ist (was standardmäßig interaktiv, aber nicht in Skripten der Fall ist), da zsh!
als Verlaufsreferenz analysiert . Aber in zsh würden Sie das überhaupt nicht brauchen, Sie können einfach*(D)
Punktedateien (ohne.
oder..
) in die Platzhalterübereinstimmung einbeziehen.Ich habe gerade festgestellt, dass dies in den meisten Linux-Distributionen der bequemste Weg ist:
wo
-A
= Alles auflisten außer.
und..
-1
= setze jeden Gegenstand in eine Zeilequelle
ls -A1 /your/path/ | xargs rm -rf
gelten sollteÄndern Sie entweder die
dotglob
Option Ihrer Shell und verwenden Sie*
oder verwenden Sie etwas wiefind
.quelle
rm -rf /some/dir
und dann ein neues leeres Verzeichnis an seiner Stelle erstellen.Das sollte genauso funktionieren wie @Gilles answer, aber kompakter:
oder
sollte auch ein
if
für die Verwendung in Skripten hinzufügen, nur um sicher zu sein:quelle
alias cleandir='rm -rf {,.[!.],..?}*'
jedoch.Find ist dein Freund.
Wenn Sie rekursiv nach etwas anderem in Ihrem aktuellen Verzeichnis suchen möchten ($ PWD), fügen Sie direkt nach dem
find
Befehl einen Pfad hinzu . zBfind /path ! -name '.' ! -name '..' -delete
. Wenn Sie nur dien
Anzahl der Verzeichnisse verringern möchten , verwenden Sie die-maxdepth n
Option direkt nach dem/path
Parameter.Der obige Befehl wurde auf einem Ubuntu 13.04-System getestet. Funktioniert wahrscheinlich auf anderen, modernen Linux-Systemen.
quelle
find . ! -name '.' ! -name '..' -type d -delete
Angenommen, das fragliche Verzeichnis ist
./dir
dannwürde alle Dateien
./dir
einschließlich versteckter Dateien und Verzeichnisse rekursiv und einschließlich des./dir
Verzeichnisses selbst entfernen .Wenn Sie das Verzeichnis selbst nicht löschen möchten, können Sie es anschließend neu erstellen oder verwenden
oder wenn Sie
find
nicht unterstützen-delete
,Mit
-mindepth 1
können Sie das oberste Verzeichnis behalten./dir
.quelle
Ich schlage vor, Sie experimentieren mit
Turn- ON Punkte (versteckte Dateien)
einstellen
dotglob
shopt -s dotglob
Turn- OFF Punkte
nicht gesetzt
dotglob
shopt -u dotglob
Diese Methode funktionierte genau so, wie ich es mir für einen Kopierbefehl gewünscht hatte, bei dem die versteckten Verzeichnisse fehlten.
Also habe ich ein Entfernen (Löschen) durchgeführt und hoppla ...
... das geht auch!
Mir fällt ein, dass Sie, liebe Leserin, das
message_splitter
Verzeichnis nicht sehen können . Auf jeden Fall hat es einen.svn
Ordner, der entfernt und in kopiert werden muss.Von
man
Seite ...Verweise:
quelle
Versuchen Sie diesen Code:
quelle