macOS & Linux
Die findImplementierung 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 -nameund -ofor oder - Fügen Sie diese Funktion in Ihre .bashrcDatei ein:
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
Gehen cdSie 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 pathlibModul 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 -BFlag weist Python an, keine .pycDateien zu schreiben . (Siehe auch die PYTHONDONTWRITEBYTECODEUmgebungsvariable.)
Die obigen Missbräuche missbrauchen Listenverständnisse für Schleifen, aber bei der Verwendung python -cist 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. findnimmt 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 xargsManpage:
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 generiertenrmBefehle sind ebenfalls überflüssig.