Frage Wie kann ich rekursiv alle Dateien einer bestimmten Erweiterung im aktuellen Verzeichnis löschen?


Wie lösche ich alle Dateien mit einer bestimmten Erweiterung (z. .bak) vom aktuellen Verzeichnis und allen Unterordnern über eine Befehlszeile? Einfach, ich habe Angst zu benutzen rm Da ich es einmal falsch benutzt habe und jetzt brauche ich einen Rat.


421
2017-11-15 13:03


Ursprung




Antworten:


Du brauchst es nicht einmal zu benutzen rm in diesem Fall, wenn Sie Angst haben. Benutzen find:

find . -name "*.bak" -type f -delete

Aber benutze es mit Vorsicht. Lauf zuerst:

find . -name "*.bak" -type f

um genau zu sehen, welche Dateien Sie entfernen werden.

Ebenfalls, Stelle sicher das -delete ist das letzte Argument in deinem Befehl. Wenn Sie es vor die stellen -name *.bak argument, Es wird alles löschen.

Sehen man find und man rm Für weitere Informationen und siehe auch diese Frage zu SE:


660
2017-11-15 13:08



Wie unterscheidet sich das? rm *.bak? - sayantankhan
@Bolt64 Dein rm *.bak funktioniert nicht für Unterverzeichnisse. - Radu Rădeanu
Mit Standardeinstellungen rm *.bak löscht nur alle Dateien mit der Endung .bak im aktuellen Verzeichnis. Um auch Dinge in Unterverzeichnissen zu tun, mussten Sie entweder mit Globs herumspielen, die Option -r verwenden oder das Suchbeispiel verwenden. - Hennes
@ Hennes Vorsicht mit rm -r *.bak! Es entfernt auch Verzeichnisse, die mit enden .bak mit all ihrem Inhalt. - Radu Rădeanu
Stelle sicher Das -delete ist das letzte Argument in Ihrem Befehl. Wenn Sie es vor die stellen -name *.bak Streit, Es wird alles löschen. - Michael


find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f

32
2018-04-04 19:10



Willkommen bei askubuntu! Obwohl dies eine vollkommen gültige Antwort ist, glaube ich nicht, dass es einen Vorteil bei der Verwendung dieses anstelle des -delete Flagge von find. Weitere Informationen finden Sie in der GNU Handbücher Eintrag zum Löschen von Dateien mit finden. - Glutanimate
Sie haben wahrscheinlich Recht, es ist nur eine alternative Lösung, vielleicht mehr roh;) - lokers
Dies ist nicht nur eine Alternative, sondern ein Beispiel, wie andere Befehle mit der Pipe '|' kombiniert werden können. +1 - Boris Pavlović
Diese alternativen Lösungen funktionieren auch in anderen Umgebungen, in denen das Löschen nicht möglich ist (wie Cygwin) - ciriarte
Ich denke, das ist die beste Antwort hier. - Léo Léopold Hertz 준영


Führen Sie zuerst den Befehl aus shopt -s globstar. Sie können das in der Befehlszeile ausführen, und es wird nur in diesem Shell-Fenster wirksam. Du kannst es in deine schreiben .bashrcund dann werden alle neu gestarteten Shells es aufnehmen. Der Effekt dieses Befehls ist zu machen **/ Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen rekursiv abgleichen (standardmäßig **/ bedeutet das Gleiche wie */: nur in den unmittelbaren Unterverzeichnissen). Dann:

rm **/*.bak

(oder gvfs-trash **/*.bak oder was hast du).


28
2017-11-15 18:59





Löschen von Dateien ist für mich nicht etwas, was Sie verwenden sollten rm zum. Hier ist eine Alternative:

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak                   # trash the files (thus moving them to the trash bin)

Wie Flimm in den Kommentaren feststellt:

Das Paket trash-cli macht das selbe wie gvfs-trash ohne die Abhängigkeit von gvfs.

Damit:

sudo apt-get install trash-cli

Sie müssen dafür keinen Alias ​​erstellen, da der trash-cli Paket bietet einen Befehl trashwas macht was wir wollen.

Wie Eliah Kagan in umfangreichen Kommentaren deutlich macht, kann man diese rekursiv auch mit verwenden find. In diesem Fall können Sie keinen Alias ​​verwenden. Daher wird davon ausgegangen, dass Sie die folgenden Befehle installiert haben trash-cli. Ich fasse Eliahs Kommentare zusammen:

Dieser Befehl findet und zeigt alle an .bak Dateien und Symlinks irgendwo im aktuellen Verzeichnis oder seinen Unterverzeichnissen oder darunter.

find . -name '*.bak' -xtype f

Um sie zu löschen, fügen Sie ein an -exec mit dem trash Befehl:

find . -name '*.bak' -xtype f -exec trash {} +

-xtype f Wählt Dateien und Symlinks zu Dateien, aber nicht zu Ordnern. Um auch .bak-Ordner zu löschen, entfernen Sie diesen Teil und verwenden Sie -execdir, die vermeidet cannot trash non-existent Fehler für .bak Dateien innerhalb .bak Verzeichnisse:

find . -name '*.bak' -execdir trash {} +

19
2017-11-15 13:52



"Benutze es nicht rm Dinge zu löschen "ist eine umstrittene Aussage, aber ich muss zustimmen, dass es oft klüger ist, etwas zu verwenden, das dir Dinge rückgängig machen lässt. - Oli♦
Das Paket trash-cli macht das selbe wie gvfs-trash ohne die Abhängigkeit von gvfs. - Flimm
Ich habe es in der Antwort bearbeitet, beim nächsten Mal können Sie die Bearbeitung selbst vornehmen. - don.joey
@ don.joey Diese Antwort scheint zu sagen find . -name "*.bak" -type f zeigt was an trash *.bak löscht. Ist das wirklich was du meinst? Sie können Verzeichnisse in den Papierkorb mit verschieben trash oder gvfs-trash, aber trash *.bak Verschiebt nur Dateien und Verzeichnisse, deren Namen enden .bak und die sich sofort im aktuellen Verzeichnis befinden. Die Shell wird erweitert *.bak, damit trash *.bak wird nicht beeinflussen .bak Dateien in Unterverzeichnissen, die nicht selbst benannt sind .bak. - Eliah Kagan
@ don.joey Ja ls *.bak (was ich denke du meinst) listet was auf trash *.bak Trashes. find . -name '*.bak' -xtype f -exec trash {} + Trashes alle .bak Dateien irgendwo unter .. Es kann keinen Alias ​​verwenden, also installiere trash-cli oder schreiben gvfs-trash stattdessen. Hier ist ein Beispiel.  -xtype f Wählt Dateien und Symlinks zu Dateien, aber nicht zu Ordnern. Löschen .bak  Ordner zu verwenden find . -name '*.bak' -execdir trash {} +, die vermeidet cannot trash non existent Fehler für .bak Dateien innerhalb .bak Verzeichnisse. Bitte zögern Sie nicht, dies in Ihrer Antwort zu verwenden. - Eliah Kagan


Wenn Sie alle Dateien eines bestimmten Typs, aber nur 1 Ordner "tief" aus dem aktuellen Ordner löschen wollen:

find . -maxdepth 2 -name "*.log" -type f -delete

-max Tiefe 2 weil das aktuelle Verzeichnis "."zählt als erster Ordner.


3
2017-11-26 17:21





Wenn Sie sich in einem Git Repo befinden, können Sie Folgendes verwenden:

git clean -fdx

Dies löscht nicht verfolgte Dateien und Dateien in .gitignore.


0
2017-08-09 07:38