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

531

Wie lösche ich sicher alle Dateien mit einer bestimmten Erweiterung (z. B. .bak) aus dem aktuellen Verzeichnis und allen Unterordnern mithilfe einer einzigen Befehlszeile? Einfach, ich habe Angst zu verwenden, rmda ich es einmal falsch verwendet habe und jetzt brauche ich Rat.

user216038
quelle

Antworten:

839

Sie müssen rmin diesem Fall nicht einmal verwenden , wenn Sie Angst haben. Verwendung find:

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

Verwenden Sie es jedoch mit Vorsicht. Zuerst ausführen:

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

um genau zu sehen, welche Dateien Sie entfernen.

Auch stellen Sie sicher , dass -deletedas letzte Argument ist in Ihrem Befehl. Wenn Sie es vor das setzen -name *.bak argument, wird alles gelöscht .

Siehe man findund man rmfür weitere Informationen und siehe auch diese verwandte Frage zu SE:

Radu Rădeanu
quelle
Wie unterscheidet sich das von rm *.bak?
sayantankhan
10
@ Bolt64 Dein rm *.bakwird nicht für Unterverzeichnisse funktionieren.
Radu Rădeanu
Mit den Standardeinstellungen rm *.bakwerden nur alle Dateien gelöscht, die mit .bak im aktuellen Verzeichnis enden. Um auch Dinge in Unterverzeichnissen zu tun, die Sie zum Fummeln mit Globs benötigen, verwenden Sie die Option -r oder verwenden Sie das Beispiel find.
Hennes
9
@Hennes Sei vorsichtig mit rm -r *.bak! Es werden auch Verzeichnisse entfernt, die .bakmit ihrem gesamten Inhalt enden .
Radu Rădeanu
37
Stellen Sie sicher , dass -deletedas letzte Argument in Ihrem Befehl ist. Wenn Sie es vor das -name *.bakArgument stellen, wird alles gelöscht.
Michael
40
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
lokers
quelle
1
Willkommen bei askubuntu! Obwohl dies eine absolut gültige Antwort ist, glaube ich nicht, dass es von Vorteil ist, diese anstelle der -deleteFlagge von zu verwenden find. Weitere Informationen finden Sie im GNU-Handbucheintrag zum Löschen von Dateien mit find .
Glutanimate
2
Sie haben wahrscheinlich Recht, es ist nur eine alternative Lösung, vielleicht mehr roh;)
Lokers
11
Dies ist nicht nur eine Alternative, sondern ein Beispiel dafür, wie andere Befehle zusammen mit der Pipe '|' kombiniert werden können. +1
Boris Pavlović
13
Diese alternativen Lösungen arbeiten auf anderen Umgebungen , die -delete (wie Cygwin) fehlen
ciriarte
2
Ich denke das ist die beste Antwort hier.
Léo Léopold Hertz 준영
33

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. Sie können es in Ihre legen .bashrc, und dann werden alle neu gestarteten Muscheln es abholen. Mit diesem Befehl werden **/Übereinstimmungsdateien im aktuellen Verzeichnis und seinen Unterverzeichnissen rekursiv erstellt ( **/bedeutet standardmäßig dasselbe wie */: Nur in den unmittelbaren Unterverzeichnissen). Dann:

rm **/*.bak

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

Gilles
quelle
21

Das Löschen von Dateien ist für mich nichts, wofür Sie verwenden sollten rm. 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-climacht dasselbe wie gvfs-trashohne die Abhängigkeit von gvfs.

Damit:

sudo apt-get install trash-cli

Sie müssen dafür keinen Alias trash-clierstellen , da das Paket einen Befehl bereitstellt trash, der das tut, was wir wollen.

Wie Eliah Kagan in ausführlichen Kommentaren deutlich macht, können Sie dies auch rekursiv machen find. In diesem Fall können Sie keinen Alias ​​verwenden. Bei den folgenden Befehlen wird davon ausgegangen, dass Sie installiert haben trash-cli. Ich fasse die Kommentare von Eliah zusammen:

Dieser Befehl sucht und zeigt alle .bakDateien und Symlinks im aktuellen Verzeichnis oder seinen Unterverzeichnissen oder darunter an.

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

Um sie zu löschen, hängen Sie an -execmit dem trashBefehl:

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

-xtype fWählt Dateien und Symlinks zu Dateien aus, aber nicht zu Ordnern. Um auch .bak-Ordner zu löschen, entfernen Sie diesen Teil und verwenden Sie -execdir, um cannot trash non-existentFehler für .bakDateien in .bakVerzeichnissen zu vermeiden :

find . -name '*.bak' -execdir trash {} +
don.joey
quelle
4
"Nicht rmzum Löschen von Dingen verwenden" ist eine kontroverse Aussage, aber ich muss zustimmen, dass es oft klüger ist, etwas zu verwenden, mit dem Sie Dinge rückgängig machen können.
Oli
2
Das Paket trash-climacht dasselbe wie gvfs-trashohne die Abhängigkeit von gvfs.
Flimm
Ich habe es in der Antwort bearbeitet, beim nächsten Mal kannst du es gerne selbst bearbeiten.
don.joey
@ don.joey Diese Antwort scheint zu sagen, find . -name "*.bak" -type fwas trash *.baklöscht. Ist das wirklich was du meinst? Sie können Verzeichnisse mit trashoder in den Papierkorb verschieben gvfs-trash, es trash *.bakwerden jedoch nur Dateien und Verzeichnisse verschoben, deren Namen mit enden .bakund die sich unmittelbar im aktuellen Verzeichnis befinden. Die Shell wird erweitert *.bak, wirkt sich also trash *.baknicht auf .bakDateien in Unterverzeichnissen aus, die nicht selbst benannt sind .bak.
Eliah Kagan
1
@ don.joey Ja ls *.bak(was ich denke du meinst) listet welche trash *.bakTrashes. find . -name '*.bak' -xtype f -exec trash {} +Müllt alle .bakDateien in den Papierkorb .. Es kann kein Alias ​​verwendet werden. Installieren trash-clioder schreiben Sie gvfs-trashstattdessen. Hier ist ein Beispiel. -xtype fWählt Dateien und Symlinks zu Dateien aus, aber nicht zu Ordnern. Um auch .bak Ordner zu löschen , verwenden Sie find . -name '*.bak' -execdir trash {} +, um cannot trash non existentFehler für .bakDateien in .bakVerzeichnissen zu vermeiden . Bitte zögern Sie nicht, dies in Ihrer Antwort zu verwenden.
Eliah Kagan
5

Wenn Sie alle Dateien eines bestimmten Typs, aber nur einen Ordner "deep" aus dem aktuellen Ordner löschen möchten:

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

-maxdepth 2, da das aktuelle Verzeichnis " . " als erster Ordner gilt.

Heuchler
quelle
1

Schnelle Antwort:

  • Löschen Sie alle Dateien mit dem betrachteten Namen oder Postfix rekursiv:

    find . -name '*.pyc' -type f -delete

  • Löschen Sie alle Verzeichnisse mit dem betrachteten Namen rekursiv:

    find ~ -path '*/__pycache__/*' -delete‍‍‍
    find ~ -type d -name '__pycache__' -empty -delete‍‍‍
    

    Etwas weniger streng kontrolliert, aber in einer einzigen Zeile:

    find ~ -path '*/__pycache__*' -delete
    

[ HINWEIS ]:

dist eine Verzeichnisoption und feine Dateioption.

Benyamin Jafari
quelle
0

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.

Vasantha Ganesh K
quelle