macOS & Linux
Die find
Implementierung von BSD unter macOS unterscheidet sich von GNU find - dies ist sowohl mit BSD als auch mit GNU find kompatibel. Beginnen Sie mit einer Globbing-Implementierung, verwenden Sie -name
und -o
for oder - Fügen Sie diese Funktion in Ihre .bashrc
Datei ein:
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
Gehen cd
Sie dann zu dem Verzeichnis, das Sie rekursiv bereinigen möchten, und geben Sie ein pyclean
.
GNU nur find
Dies ist eine GNU-Find-Only-Lösung (dh Linux), aber ich finde, dass sie mit dem regulären Ausdruck etwas besser ist:
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
Jede Plattform mit Python 3
Unter Windows haben Sie wahrscheinlich nicht einmal find
. Sie haben jedoch wahrscheinlich Python 3, das ab 3.4 das praktische pathlib
Modul hat:
python3 -Bc "import pathlib; [p.unlink() for p in pathlib.Path('.').rglob('*.py[co]')]"
python3 -Bc "import pathlib; [p.rmdir() for p in pathlib.Path('.').rglob('__pycache__')]"
Das -B
Flag weist Python an, keine .pyc
Dateien zu schreiben . (Siehe auch die PYTHONDONTWRITEBYTECODE
Umgebungsvariable.)
Die obigen Missbräuche missbrauchen Listenverständnisse für Schleifen, aber bei der Verwendung python -c
ist Stil eher ein zweitrangiges Anliegen. Alternativ könnten wir (zum Beispiel) missbrauchen __import__
:
python3 -Bc "for p in __import__('pathlib').Path('.').rglob('*.py[co]'): p.unlink()"
python3 -Bc "for p in __import__('pathlib').Path('.').rglob('__pycache__'): p.rmdir()"
Kritik einer Antwort
Die beste Antwort lautete:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Dies scheint weniger effizient zu sein, da drei Prozesse verwendet werden. find
nimmt einen regulären Ausdruck, daher benötigen wir keinen separaten Aufruf von grep
. In ähnlicher Weise hat es -delete
, so dass wir keinen separaten Aufruf von benötigen rm
- und im Gegensatz zu einem Kommentar hier werden nicht leere Verzeichnisse gelöscht, solange sie aufgrund der Übereinstimmung mit regulären Ausdrücken geleert werden.
Von der xargs
Manpage:
find /tmp -depth -name core -type f -delete
Suchen Sie Dateien mit dem Namen core im oder unter dem Verzeichnis / tmp und löschen Sie sie, jedoch effizienter als im vorherigen Beispiel (da wir die Verwendung von fork (2) und exec (2) zum Starten von rm vermeiden und das nicht benötigen extra xargs Prozess).
*__pycache__
,*.pyc*
und es unterscheidet nicht zwischen Dateien und Verzeichnissen. Die meisten generiertenrm
Befehle sind ebenfalls überflüssig.