Verwenden Sie rm, um Dateien und Verzeichnisse rekursiv zu entfernen

19469
user15586

Kann man mit rm Dateien und Verzeichnisse rekursiv entfernen, ohne ein anderes Kommando zu verwenden?

17

5 Antworten auf die Frage

35
warren

Um Ihre Frage direkt zu beantworten, "nein - Sie können nicht das tun, was Sie beschreiben rm".

Sie können es jedoch tun, indem Sie es kombinieren find. Hier ist eine von vielen Möglichkeiten, dies zu tun:

 # search for everything in this tree, search for the file pattern, pipe to rm find . | grep <pattern> | xargs rm 

Wenn Sie beispielsweise alle * ~ -Dateien nuken wollen, können Sie dies folgendermaßen tun:

 # the $ anchors the grep search to the last character on the line find . -type f | grep '~'$ | xargs rm 

So erweitern Sie einen Kommentar * :

 # this will handle spaces of funky characters in file names find -type f -name '*~' -print0 | xargs -0 rm 
IMO: Dies ist die beste Antwort, da Sie eine Vorschau der Dateien anzeigen können, die vor dem Löschen gelöscht werden. monksy vor 14 Jahren 0
true - wenn Sie die letzte Pipe weglassen, erhalten Sie zuerst eine Liste von allem :) warren vor 14 Jahren 1
@steven Und trotzdem hat es die Posterfrage nicht wirklich beantwortet A Dwarf vor 14 Jahren 0
also mein -1 zu diesem A Dwarf vor 14 Jahren 0
Kann die Frage des Posters nicht direkt beantworten, aber am nächsten kommen sie dem, was sie wollen. Drakia vor 14 Jahren 2
Ein Zwerg, ist das nicht ohne Grund etwas bitter? Gnoupi vor 14 Jahren 1
Der Benutzer stellt eine einfache Frage. Kann er es nur mit dem Befehl rm machen? Er fragte nicht, wie er es schaffen könnte. Bei allem, was wichtig ist, kann er andere Möglichkeiten kennen. Und doch waren vollkommen gültige Antworten auf seine Frage ohne klaren Grund herabgestuft worden. Warum sollte ich eine Antwort nicht ablehnen, die sich nicht bemüht, die eigentliche Frage zu beantworten? A Dwarf vor 14 Jahren 0
Die Antwort lautet "Nein - Sie können nicht das tun, was Sie mit" rm "beschreiben. Ich habe ihm gezeigt, wie er es tun könnte, wenn er will. warren vor 14 Jahren 0
Bitte seien Sie sehr vorsichtig mit `find | grep | xargs rm`. Wenn es Dateien mit Leerzeichen (oder Zeilenumbrüchen) gibt, wird dies unterbrochen (und abhängig von den Dateinamen und dem Ort, an dem sich die Leerzeichen befinden) möglicherweise Elemente gelöscht, die Sie nicht löschen wollten. `find… -print0 | xargs -0 rm` wird viel robuster sein. Dies bedeutet jedoch, dass Sie `grep` nicht verwenden können und die Prädikate von 'find' verwenden müssen, um nur die gewünschten Dateien zu finden und auszudrucken. Das zweite Beispiel von Warren wird robuster sein als `find -type f -name '* ~' -print0 | xargs -0 rm`. Chris Johnsen vor 14 Jahren 10
@ Chris - meine Antwort wurde aktualisiert warren vor 14 Jahren 0
@warren nach meinem Update meine Downvote entfernt A Dwarf vor 14 Jahren 0
Wenn Sie möchten, dass ein einzelner Befehl den Job ausführt, erstellen Sie einen Alias ​​mit einem der angegebenen find-Befehle. Füllt später eine Antwort aus, falls gewünscht. casualuser vor 14 Jahren 1
Sie brauchen keine funkeren Charaktere als ein Leerzeichen, um Ihre ersten Beispiele zu beenden und möglicherweise andere Dateien als gewünscht zu löschen. Ich empfehle, dass Sie sie so ändern, dass mindestens `xargs -d '\ n'` verwendet wird, um Leerzeichen zuzulassen. Die beiden ersten Beispiele werden jedoch durch Ihr letztes Beispiel übertrumpft, also lassen Sie sie vielleicht einfach aus. Sie sind langsamer und weniger zuverlässig. Daniel Andersson vor 11 Jahren 0
8
Drakia

"ohne andere Befehle"

Nein.

Nette Antwort, die veranschaulicht, dass "die ursprüngliche Frage streng beantwortet wird (mit der Gefahr, keine Lösung anbieten zu können)", "eine Lösung zu bieten, auch wenn sie sich nicht strikt an die auferlegten Beschränkungen hält". Gnoupi vor 14 Jahren 0
Ich habe dies nur gepostet, da "Ein Zwerg" sich über die Antwort beschwert hat, die tatsächlich eine Lösung lieferte. Ohne die Verwendung anderer Befehle gibt es wirklich keine Möglichkeit zum rekursiven Löschen von ** Dateien **, die einem Muster entsprechen, nur das Löschen von Dateien und Verzeichnissen im aktuellen Verzeichnis. Drakia vor 14 Jahren 0
3
Daniel Andersson

Using Bash, with globstar set, yes:

rm basedir/**/my*pattern* 

Try it with e.g. ls -1 first, before rm to list the files you match.

You set options through e.g. shopt -s globstar.


Alternatively, a shorter find variant:

find -type f -name 'my*pattern*' -delete 

or for GNU find:

find -type f -name 'my*pattern*' -exec rm {} + 

or another alternative for non-GNU find (a bit slower):

find -type f -name 'my*pattern*' -exec rm {} \; 

To also remove directories, as you ask for: just change rm into rm -r in the above commands and skip matching on only -type f in the find commands.

0
ianfuture

Ich hätte "rm -rf" abgespeichert, wo sich eine Kombination aus Dateinamen und übereinstimmenden Mustern wie * und? etc (zB todays_log_2009 ????. log). Das wird von aktuellem Dir ausgehen und das rekursive Entfernen von Dateien, die dieses Muster betreffen, werden abgebrochen.

Dies funktioniert nicht, da das Muster von der Shell im aktuellen Verzeichnis erweitert wird. Bei Anführungszeichen wird das Muster zu einem Dateinamen mit Sonderzeichen. Um zB die Datei zu löschen, könnte man rm '[' schreiben. Das Muster verliert einfach seine Bedeutung. casualuser vor 14 Jahren 0
0
kaleissin

Wenn Sie zsh (1) verwenden, setopt extendedglobaktivieren Sie mit .zshrc "extended globbing". Wenn Sie dem Muster "** /" voranstellen, wird es anschließend rekursiv gelöscht:

% rm -rf ** / <pattern>

Wenn es jedoch viele Dateien gibt, die gelöscht werden sollen, sollten Sie mit xargs (1) oder -exec suchen (1), und ich empfehle das auch in Shell-Skripten.