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?

Teifion
quelle
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 {} \;
Bill die Eidechse
quelle
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.

Andy Baker
quelle
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 .
jb.
quelle
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
Wilfred Hughes
quelle
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
d0k
quelle
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 "{}"'
miku
quelle
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
haki
quelle
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.

Ron Romero
quelle
16
$ find . -name '*.pyc' -delete

Das ist schneller als

$ find . -name "*.pyc" -exec rm -rf {} \;
Moxdaten
quelle
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
Mithril
quelle
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`
Clint Miller
quelle
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
romuloigor
quelle
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

Michael Benin
quelle
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
Kevin Sabbe
quelle
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.

Chris Lutz
quelle
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
2
find . -name "*.pyc"|xargs rm -rf
PiyusG
quelle
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.

gpap
quelle
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
Girish Vas
quelle