macOS e Linux
L' find
implementazione di BSD su macOS è diversa da GNU find - questo è compatibile con BSD e GNU find. Inizia con un'implementazione globbing, usando -name
e -o
per o - Inserisci questa funzione nel tuo .bashrc
file:
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
Quindi cd
nella directory che si desidera pulire in modo ricorsivo e digitare pyclean
.
GNU trova solo
Questa è una soluzione GNU find, only (ie Linux), ma penso che sia un po 'più piacevole con regex:
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
Qualsiasi piattaforma, usando Python 3
Su Windows, probabilmente non hai nemmeno find
. Tuttavia, probabilmente hai Python 3, che a partire dalla 3.4 ha il comodo pathlib
modulo:
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__')]"
La -B
bandiera dice a Python di non scrivere .pyc
file. (Vedi anche la PYTHONDONTWRITEBYTECODE
variabile d'ambiente.)
Gli abusi di cui sopra elencano le comprensioni per il looping, ma quando si utilizza python -c
, lo stile è piuttosto una preoccupazione secondaria. In alternativa, potremmo abusare (ad esempio) __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()"
Critica di una risposta
La risposta principale diceva:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Ciò sembrerebbe meno efficiente perché utilizza tre processi. find
prende un'espressione regolare, quindi non abbiamo bisogno di una chiamata separata di grep
. Allo stesso modo, si è -delete
, quindi non abbiamo bisogno di un'invocazione separata rm
contrario -e per un commento qui, sarà eliminare le directory non vuote fintanto che vengono svuotati in virtù del match espressione regolare.
Dalla xargs
pagina man:
find /tmp -depth -name core -type f -delete
Trova i file denominati core all'interno o sotto la directory / tmp ed eliminali, ma in modo più efficiente rispetto all'esempio precedente (perché evitiamo la necessità di usare fork (2) ed exec (2) per avviare rm e non abbiamo bisogno del processo xargs extra).
*__pycache__
,*.pyc*
e non distinguere tra file e directory. Anche la maggior parte deirm
comandi generati sarà superflua.