Wie entferne ich alle .pyc-Dateien aus einem Projekt?


677

Ich habe einige Dateien in einem ziemlich großen Projekt umbenannt und möchte die zurückgelassenen .pyc-Dateien entfernen. Ich habe das Bash-Skript ausprobiert:

 rm -r *.pyc

Aber das geht nicht so durch die Ordner, wie ich es mir vorgestellt habe. Was mache ich falsch?


11
Dies funktioniert nicht, da unter UNIX Globs von der Shell und nicht vom ausgeführten Programm erweitert werden. Wenn Sie a.pyc und b.pyc im aktuellen Verzeichnis haben und die Verzeichnisse foo und bar rmmit den Argumenten [-r, a.pyc, b.pyc] aufgerufen werden.
Ephemient

1
Wenn Sie sich Sorgen machen, Ihren Code an andere Personen weiterzuleiten, können Sie ihn einfach zum .gitignore hinzufügen, **/*.pycdann müssen Sie sich nicht erneut darum kümmern
bubakazouba

Antworten:


1165
find . -name "*.pyc" -exec rm -f {} \;

384
Find hat eine eingebaute "-delete" -Aktion, so dass Sie einfach tun könnenfind . -name \*.pyc -delete
Christoffer

51
Wenn es sich um eine Entwicklungsmaschine handelt, können Sie vor allem PYTHONDONTWRITEBYTECODE = True festlegen, und Sie müssen dies nie wieder tun. Siehe: diese Antwort .
mlissner

5
Sie zitieren nicht {}. Was würde passieren, wenn versehentlich ein Zwischenpfad, der zufällig wie ein Fragment des gefundenen Pfads aufgerufen wird, in Wörter aufgeteilt und gelöscht würde?
Robottinosino

20
-deleteist nicht Teil der POSIX-Spezifikation und kann nicht in allen Implementierungen von garantiert werden find.
Chepner

7
Wenn Sie Angst haben - was gut sein könnte - machen Sie einen ersten Durchgang mit -exec echo {} oder - wenn Sie große Angst haben - verwenden Sie rm -i {}, das Sie jedes Mal fragt, oder rm - v {}, damit Sie sehen, was du löschst.
JeanM

1021

find . -name '*.pyc' -delete

Sicher das einfachste.


21
Wenn Ihre Version von findunterstützt -delete; Es ist nicht Teil des POSIX-Standards.
Chepner

4
Dies ignoriert .pyo-Dateien und -Verzeichnisse __pycache__. Siehe meine Antwort.
Wilfred Hughes

Ich habe den Code aus der akzeptierten Antwort verwendet und es hat funktioniert, aber diese Befehle sind kürzer und einfach
Dap

3
-name '*.py?'zu enthalten.pyo, .pyc,...
cdosborn

2
MAKE SURE -delete ist das Letzte im Befehl. Ich habe versehentlich gleich nach dem Fund -delete gesetzt. Es hat alles gelöscht!
thinkanotherone

85

In der aktuellen Version von Debian haben Sie ein pycleanSkript, das sich in befindetpython-minimal Paket enthalten ist.

Die Verwendung ist einfach:

pyclean .

34
Es ist erwähnenswert, dass pyclean anscheinend nur .pyc-Dateien löscht, für die es eine entsprechende .py-Datei gibt (zumindest auf meinem System - ubuntu 12.10.). Dies bedeutet, dass es in Situationen, in denen eine Quelldatei gelöscht wurde und Sie möchten, nicht sehr hilfreich ist um die übrig gebliebenen .pyc-Dateien zu bereinigen.
TigerFinch

@holms pyclean(und jetzt py3clean) stammen aus einem Debian-Paket und sind daher nicht in RHEL enthalten.
Duozmo

83

Fügen Sie Ihrem hinzu ~/.bashrc:

pyclean () {
        find . -type f -name "*.py[co]" -delete
        find . -type d -name "__pycache__" -delete
}

Dadurch werden alle .pyc- und .pyo-Dateien sowie __pycache__Verzeichnisse entfernt. Es ist auch sehr schnell.

Verwendung ist einfach:

$ cd /path/to/directory
$ pyclean

find . -type d -name "__pycache__" -deletegibt häufig eine Warnung über einen fehlenden Pfad aus, da der Inhalt anscheinend der Warteschlange hinzugefügt wird, bevor der Ordner gelöscht wird. 2>/dev/nullsollte das beheben.
Mad Physicist

53

Wenn Sie bash> = 4.0 (oder zsh) verwenden

rm **/*.pyc

Beachten Sie, dass */*.pycalle .pycDateien in den unmittelbaren Unterverzeichnissen der ersten Ebene ausgewählt werden, während **/*.pycder gesamte Verzeichnisbaum rekursiv durchsucht wird. Als Beispiel foo/bar/qux.pycwird von gelöscht, rm **/*.pycaber nicht von */*.pyc.

Die Globstar-Shell-Optionen müssen aktiviert sein. So aktivieren Sie globstar:

shopt -s globstar

und um seinen Status zu überprüfen:

shopt globstar

1
Was ist der Unterschied zwischen Laufen rm **/*.pycund Laufen rm */*.pyc? (Letzteres schien vor Ort für mich zu arbeiten.)
Taylor Edmiston

1
@ TaylorEdmiston rm */*.pyclöscht alle .pycDateien in allen Unterverzeichnissen der Tiefe 1. rm **/*.pyclöscht alle .pycDateien in allen Unterverzeichnissen der Tiefe 0+
Adam Stewart

@AdamStewart Danke, dass du das hinzugefügt hast. Für andere, die über diesen Thread gestolpert sind, war das Problem, das ich hatte, dass Apples Bash, das mit OS X ausgeliefert wurde, keinen Globstar enthält (verhält sich also **so, *als würde das Ausführen stattdessen und das Ausführen shopt globstareinen Fehler auslösen ).
Taylor Edmiston

30

Ich habe dafür einen Alias ​​verwendet:

$ which pycclean

pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'

12
Im aktuellen Debian ist es pyclean.
jb.

7
Dies geht nicht gut mit Leerzeichen in Dateinamen um. Sie sollten find -print0und xargs -0stattdessen verwenden.
r3m0t

2
Warum sollten Sie Python-Code mit Leerzeichen in den Datei- / Ordnernamen haben wollen? Ist das syntaktisch legal?
Coredumperror

@CoreDumpError, ja, tatsächlich wird Python unter Windows in einem Verzeichnis mit Leerzeichen ("Programme") installiert.
Paul Draper

Der Python-Interpreter wird möglicherweise standardmäßig dort installiert, aber es ist kaum ein guter Ort, um Ihren Code einzufügen . Außerdem möchten Sie sicher nicht, dass der Ordner "Programme" Teil Ihrer Paketstruktur ist, weshalb ich bei der Syntax vorsichtig war.
Coredumperror

24

Für Windows-Benutzer:

del /S *.pyc

Das Einfügen in ein Batch-Skript macht die Sache super einfach. Vielen Dank.
Nick Gotch

Und wenn Sie auf Powershell sind, kann dies mit "cmd" -> Befehl ausführen -> "beenden" verwendet werden.
np8

18
find . -name '*.pyc' -print0 | xargs -0 rm

Der Fund sucht rekursiv nach * .pyc-Dateien. Die xargs nehmen diese Liste von Namen und senden sie an rm. Mit -print0 und -0 werden die beiden Befehle angewiesen, die Dateinamen durch Nullzeichen zu trennen. Dies ermöglicht die korrekte Verwendung von Dateinamen, die Leerzeichen enthalten, und sogar von Dateinamen, die eine neue Zeile enthalten.

Die Lösung mit -exec funktioniert, aber es wird für jede Datei eine neue Kopie von rm erstellt. Auf einem langsamen System oder mit sehr vielen Dateien dauert das zu lange.

Sie können auch ein paar weitere Argumente hinzufügen:

find . -iname '*.pyc' -print0 | xargs -0 --no-run-if-empty  rm

Iname fügt Groß- und Kleinschreibung hinzu, z. B. * .PYC. Das no-run-if-empty verhindert, dass Sie einen Fehler von rm erhalten, wenn Sie keine solchen Dateien haben.


16
$ find . -name '*.pyc' -delete

Das ist schneller als

$ find . -name "*.pyc" -exec rm -rf {} \;

11

Ferner wollen die Menschen in der Regel alle entfernen *.pyc, *.pyoDateien und __pycache__Verzeichnisse rekursiv im aktuellen Verzeichnis.

Befehl:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

Dies ist eine gute Antwort, aber eine einfache Python-Lösung wäre plattformübergreifend und daher vorzuziehen. Während persönlich ist es mir nicht über Windows wahrscheinlich die Hälfte der Python Bevölkerung lebt auf Windows - und find, grepund Freunde dort nicht funktionieren.
Peterino

Sie tun dies, wenn Sie das Werkzeug installieren. Ich würde jedem Windows - CLI Benutzer empfehlen Sie so Cross-compat zu erleichtern: superuser.com/questions/168202/...
DylanYoung

8

Um eine andere Variante in den Mix zu werfen, können Sie auch folgende Backquotes verwenden:

rm `find . -name *.pyc`

5
Dies hat den leichten Nachteil, dass es fehlschlägt, wenn zu viele Übereinstimmungen vorliegen, da zu viele Argumente vorhanden sind, an die weitergegeben werden kann rm.
Chepper


7

voll rekursiv

ll **/**/*.pyc
rm **/**/*.pyc

Interessant, wie ist das im Vergleich zu den Antworten von Andy und Bill?
Austin Henley

3
Ein Satz von ** ist redundant, und wie in d0kder Antwort muss Globstar in Bash 4+ aktiviert sein, damit dies wie beabsichtigt funktioniert. dh tun shopt -s globstaroder haben Sie das in einer Ihrer bezogenen Bash. Dateien.
Setzen Sie Monica bitte

1
Auch llist in der Regel auf etwas wie Alias ​​ausgerichtet ls -l, ist aber nicht wirklich ein Befehl oder portabel. Also, um rekursiv alle .pycDateien in aufzulisten.echo **/*.pycUm aufzulisten , sollten Sie stattdessen etwas tun, bei dem Globstar aktiviert ist
Monica

3

Erster Lauf:

find . -type f -name "*.py[c|o]" -exec rm -f {} +

Dann füge hinzu:

export PYTHONDONTWRITEBYTECODE=1

Zu ~ / .profile


3

Wenn Sie .pyc nicht mehr möchten, können Sie diese einzelne Zeile in einem Terminal verwenden:

export PYTHONDONTWRITEBYTECODE=1

Wenn Du Deine Meinung änderst:

unset PYTHONDONTWRITEBYTECODE

2

rm -rrekursiert in Verzeichnisse, aber nur in die Verzeichnisse, denen Sie geben rm. Diese Verzeichnisse werden ebenfalls gelöscht. Eine Lösung ist:

for i in $( find . -name *.pyc )
do
  rm $i
done

findfindet alle * .pyc-Dateien rekursiv im aktuellen Verzeichnis, und die forSchleife durchläuft die Liste der gefundenen Dateien und entfernt jede einzelne.


Dieser funktioniert, obwohl ich ihn in eine .sh-Datei einfügen und ausführen muss (was für mich in Ordnung ist, ich werde diesen Befehl mehr als einmal verwenden)
Teifion

Ich glaube, wenn Sie alles in eine durch ';' getrennte Zeile setzen, sollten Sie es an der Shell ausführen. Aber wenn ich das in bash tippe, wartet bash darauf, dass das "erledigt" am Ende etwas ausführt ...
Chris Lutz

Das ist ein schreckliches Antimuster (und ein sehr häufiges auch, ich wünschte, es könnte verschwinden): Es bricht mit Dateinamen, die Leerzeichen oder Glob-Zeichen enthalten. Und es verfehlt den Punkt findmit seinem -execPrädikat: find . -name '*.pyc' -exec rm {} +(schöner, kürzer, sicherer, robuster, effizienter).
gniourf_gniourf


1

Du kannst rennen find . -name "*.pyc" -type f -delete.

Verwenden Sie es jedoch mit Vorsicht. Zuerst ausführenfind . -name "*.pyc" -type f , um genau zu sehen, welche Dateien Sie entfernen werden.

Stellen Sie außerdem sicher, dass -delete das letzte Argument in Ihrem Befehl ist. Wenn Sie es vor das Argument -name * .pyc setzen, wird alles gelöscht.


1

Wenn Sie alle .pyc-Dateien aus dem Projektordner löschen möchten.

Erstens hast du

cd <path/to/the/folder>

Suchen Sie dann die gesamte .pyc-Datei und löschen Sie sie.

find . -name \*.pyc -delete
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.