Verwenden Sie rm, um Dateien und Verzeichnisse rekursiv zu entfernen

17

Ist es möglich, mit rm Dateien und Verzeichnisse zu entfernen, die einem Muster rekursiv entsprechen, ohne andere Befehle zu verwenden?

user15586
quelle

Antworten:

35

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

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

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

Wenn Sie beispielsweise alle * ~ -Dateien mit einem Nuke versehen möchten, 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
Labyrinth
quelle
1
true - wenn du die letzte Pipe weglässt, bekommst du zuerst eine Liste von allem :)
warren
2
Möglicherweise wird die Frage des Posters nicht direkt beantwortet, aber sie kommt dem, was sie wollen, am nächsten.
Drakia
1
Ein Zwerg, ist das nicht ein bisschen bitter ohne Grund?
Gnoupi
10
Bitte seien Sie sehr vorsichtig mit find | grep | xargs rm. Wenn Dateien mit Leerzeichen (oder Zeilenumbrüchen) vorhanden sind, kann dies dazu führen, dass (abhängig von den Dateinamen und der Position der Leerzeichen) Daten gelöscht werden, die Sie nicht löschen wollten. find … -print0 | xargs -0 rmwird viel robuster sein. Dies bedeutet jedoch, dass Sie die Prädikate nicht verwenden können grepund müssen, um findnur die gewünschten Dateien abzugleichen und zu drucken. Das zweite Beispiel von warren wird robuster sein als find -type f -name '*~' -print0 | xargs -0 rm.
Chris Johnsen
1
Wenn Sie möchten, dass ein einzelner Befehl den Job ausführt, erstellen Sie einen Alias ​​mithilfe eines der angegebenen Suchbefehle. Falls gewünscht, wird dies später beantwortet.
casualuser
8

"ohne andere Befehle zu benutzen"

Nein.

Drakia
quelle
Eine gute Antwort, die die Debatte "Beantworte die ursprüngliche Frage genau (auf die Gefahr hin, keine Lösung zu finden)" und "biete eine Lösung, auch wenn sie nicht genau mit den auferlegten Beschränkungen übereinstimmt" illustriert.
Gnoupi
Ich habe dies nur gepostet, als "Ein Zwerg" sich über die Antwort beschwerte, die tatsächlich eine Lösung lieferte. Ohne die Verwendung anderer Befehle ist das rekursive Löschen von Dateien , die einem Muster entsprechen, nicht möglich, sondern nur das Löschen von Dateien / Verzeichnissen im aktuellen Verzeichnis.
Drakia
3

Mit Bash, mit globstarset, yes :

rm basedir/**/my*pattern*

Probieren Sie es zB ls -1zuerst aus, bevor rmSie die passenden Dateien auflisten.

Sie setzen Optionen durch zB shopt -s globstar.


Alternativ eine kürzere findVariante:

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

oder für GNU find:

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

oder eine andere Alternative für Nicht-GNU find(etwas langsamer):

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

Wenn Sie auch Verzeichnisse entfernen möchten, gehen Sie wie folgt vor: Wechseln Sie rmin rm -rdie obigen Befehle und überspringen Sie den Abgleich nur -type fin den findBefehlen.

Daniel Andersson
quelle
0

Ich hätte "rm -rf" abgesaugt, wo eine Kombination aus Dateinamen und übereinstimmenden Mustern wie * und? etc (zB todays_log_2009 ????. log). Das startet mit dem aktuellen Verzeichnis und führt dazu, dass Dateien, die dieses Muster enthalten, rekursiv entfernt werden.

ianfuture
quelle
Dies funktioniert nicht, da das Muster von der Shell im aktuellen Verzeichnis erweitert wird. Wenn in Anführungszeichen gesetzt, wird das Muster zu einem Dateinamen mit Sonderzeichen. zB um die Datei [zu löschen, könnte man rm '[' schreiben. Das Muster verliert einfach seine Bedeutung.
casualuser
0

Wenn Sie zsh (1) verwenden , setopt extendedglobaktivieren Sie "Extended Globbing" mit in .zshrc. Das Präfixieren des Musters mit '** /' löscht dann rekursiv:

% rm -rf ** / <Muster>

Wenn Sie jedoch viele Dateien löschen möchten, sollten Sie auf find (1) mit xargs (1) oder -exec zurückgreifen, und ich empfehle, dies auch in Shell-Skripten zu tun.

kaleissin
quelle