Diese Frage ist eine Art Phase II der ersten Frage, die ich hier gestellt habe
Ich habe ein Verzeichnis, das eine Reihe von Unterverzeichnissen, ZIP-Dateien und anderen zufälligen Dateien enthält, die nicht in einem Unterverzeichnis enthalten sind.
Ich möchte ein Befehlszeilenskript, um alle Unterverzeichnisse aus dem übergeordneten Verzeichnis zu entfernen, aber alle ZIP-Dateien und losen Dateien, die zu keinen Unterverzeichnissen gehören, beizubehalten. Alle Unterverzeichnisse haben Inhalt, daher glaube ich, dass ich das Löschen mit dem Befehl -f erzwingen muss.
Im Grunde genommen löscht ein Befehl, der sich im übergeordneten Verzeichnis (oder im aktuellen Verzeichnis) befindet, alle darin enthaltenen Ordner, behält jedoch alle anderen Inhalte und Dateien bei, die kein Ordner sind oder in einem Ordner enthalten sind.
Ich verstehe, dass das Löschen von Elementen über die Befehlszeile besondere Sorgfalt erfordert, aber ich habe bereits alle erforderlichen Vorkehrungen getroffen, um eine Remote-Sicherung durchzuführen.
-r
,-R
,--recursive
Sind Synonyme „entfernen Verzeichnisse und deren Inhalt rekursiv“ bedeutet.rm -R ./*/
- Es vermeidet auch Probleme mit Bindestrichnamen.Zusätzlich zum Wildcard-Weg können Sie auch
find
(mindestens GNU find) verwenden, um dies zu tun:Wie bei anderen
find
Zeilen können Sie den ersten Teil (find -mindepth 1 -maxdepth 1 -type d
) ausführen , um eine Liste der zu entfernenden Verzeichnisse anzuzeigen.Eine sicherere Option besteht darin, Folgendes zu tun:
Jedes davon verschiebt das gesamte Material,
../to-rm
anstatt es zu löschen. Sie können überprüfen, ob es getan hat, was Sie wollten, indem Sierm -Rf
das Verzeichnis nach Belieben auswählen.quelle
to-rm
undfind
der gut behandelt Verzeichnisse mit einem Punkt (zusätzlich zu allen anderen umständlich escaping) beginnen. :)Möglicherweise möchten Sie insbesondere für einige dieser Vorschläge ein Skript erstellen
rm -R -- */
und in Ihrem Ordner / usr / local / bin aufbewahren. oder erstellen Sie einealias
in Ihrer ~ / .bashrc-Datei. Da es so einfach ist, einen Befehl falsch einzugeben und Ihr System zu beschädigen - selbst ein einzelner Buchstabe und / oder die Reihenfolge der Buchstaben können katastrophale Folgen haben -, wäre dies eine etwas robustere Lösung, als die verschiedenen Optionen und Argumente eingeben zu müssen jedes Mal, wenn Sie diese Aufgabe ausführen möchten.Möglicherweise möchten Sie Ihrem Skript / Befehl auch die Option
-i or --interactive=once
oder-I or --interactive=always
hinzufügen, die als weiteres Werkzeug dient, um unbeabsichtigte Löschvorgänge zu vermeiden.Darüber hinaus wäre etwas wie derobert vorgeschlagen am besten; Kopieren Sie das Skript einfach in einen Datei- / Terminal-Editor und passen Sie es an Ihre spezifischen Bedürfnisse an. Die Dateien / Verzeichnisse werden in ein einzelnes Verzeichnis verschoben (dessen Inhalt Sie überprüfen / verifizieren können), das Sie einfach entfernen können Ausgabe des
rm -rf
Befehls.Eine andere Möglichkeit besteht darin, eine GUI-Anwendung wie Ihren Dateimanager zu verwenden und einfach alle zutreffenden Dateien / Ordner auszuwählen, die Sie löschen möchten. Überprüfen Sie die Handbuchseiten Ihrer Distribution, wenn Sie keine Berechtigungen haben.
Wenn die Ordner leer sind - im Wesentlichen einfache Dateinamen -, können Sie sie mit dem
rmdir
Befehl löschen. Es funktioniert nicht für alles, was Sie löschen möchten, aber es wird sich als nützlich erweisen, wenn Sie eine "Hausreinigung" durchführen möchten. ** Möglicherweise möchten Sie die-p --ignore-fail-on-non-empty
Option ausprobieren , mit der Sie bestimmte Unterverzeichnisse sowie deren leere "Eltern" - die Verzeichnisse, in denen sie sich befinden - löschen können.quelle
Zuerst müssen Sie die Verzeichnisse auflisten und dann entfernen, ohne die normalen Dateien zu beeinträchtigen. Ls -d * / listet nur die Unterverzeichnisse auf, und wenn Sie es mit rm weiterleiten, werden die Verzeichnisse und Inhalte entfernt, wobei die losen Dateien intakt bleiben.
Dieser Befehl sollte die Arbeit erledigen,
quelle
rm -rf -- */
?printf '%s\0' */ | xargs -r0 rm -rf --
würde helfen (in Shells, woprintf
es eingebaut ist und nichtls
), um zu große Fehler in derls -d */ | xargs rm -rf
Arg- Liste zu umgehen, füge aber nichts AFAICT hinzu, außer zusätzliche Probleme." .."
(Leerzeichen..
) vorhanden ist, wird bei einigenls
Implementierungen der Inhalt des übergeordneten Verzeichnisses entfernt . Und es sind nicht nur Leerzeichen, sondern auch andere Leerzeichen, Zeilenumbrüche, einfache Anführungszeichen, doppelte Anführungszeichen, umgekehrte Schrägstriche und Dateinamen, die mit beginnen-
.printf
eine Liste zu erstellen,xargs
bei der jeder Name mit dem Null-Zeichen abgeschlossen ist, damit er mit der-0
Option verarbeitet werden kann, vollständig verstanden haben , sollten Sie Ihre Antwort bearbeiten , um sie mit seiner Variation zu aktualisieren. Ich bin mir ziemlich sicher, dass er sich freuen würde, wenn Sie sein Code-Snippet verwenden, wenn Sie es verstehen und wissen, wie es vor unerwünschtem Verhalten schützt, das durch bestimmte möglicherweise vorhandene Dateinamen verursacht wird.xargs
hat einen Vorteil gegenüber der akzeptierten Antwort (sie funktioniert, wenn das aktuelle Verzeichnis eine sehr große Anzahl von Dateien / Verzeichnissen enthält), sodass Sie diese in eine nützliche Antwort umwandeln können. Persönlich habe ich festgestellt, dass das Beantworten von Stack Exchange- Fragen eine gute Lernerfahrung ist - insbesondere, wenn ich nützliche Rückmeldungen von anderen Benutzern erhalte.rm -rf <directory name>
. Es klappt. Das bloße Tippenrm <directory name>
führt nur zu einer Reihe von Unterfragen, in denen jedes Unterverzeichnis manuell entfernt werden muss. Aberrm -rf
hilft das ganze Verzeichnis zusammen mit seinen Unterverzeichnissen auf einmal zu entfernen.quelle