macOS y Linux
La find
implementación de BSD en macOS es diferente de GNU find: esto es compatible con BSD y GNU find. Comience con una implementación global, usando -name
y -o
para o - Ponga esta función en su .bashrc
archivo:
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
Luego, cd
al directorio que desea limpiar de forma recursiva, y escriba pyclean
.
GNU solo de búsqueda
Esta es una solución de GNU find, only (es decir, Linux), pero creo que es un poco más agradable con la expresión regular:
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
Cualquier plataforma, usando Python 3
En Windows, probablemente ni siquiera tienes find
. Sin embargo, probablemente tenga Python 3, que a partir de 3.4 tiene el pathlib
módulo conveniente :
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
bandera le dice a Python que no escriba .pyc
archivos. (Ver también elPYTHONDONTWRITEBYTECODE
variable de entorno).
Los abusos anteriores enumeran las comprensiones para el bucle, pero cuando se usa python -c
, el estilo es más bien una preocupación secundaria. Alternativamente, podríamos abusar (por ejemplo) __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()"
Crítica de una respuesta
La respuesta principal solía decir:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Esto parece ser menos eficiente porque utiliza tres procesos. find
toma una expresión regular, por lo que no necesitamos una invocación separada de grep
. Del mismo modo, lo ha hecho -delete
, por lo que no necesitamos una invocación por separado de, rm
y al contrario de un comentario aquí, lo hará eliminar directorios no vacíos tanto tiempo a medida que se vacían en virtud de la coincidencia de expresiones regulares.
Desde la xargs
página del manual:
find /tmp -depth -name core -type f -delete
Busque archivos denominados core en o debajo del directorio / tmp y elimínelos, pero de manera más eficiente que en el ejemplo anterior (porque evitamos la necesidad de usar fork (2) y exec (2) para iniciar rm y no necesitamos el proceso de xargs extra).
*__pycache__
,*.pyc*
y no distingue entre archivos y directorios. La mayoría de losrm
comandos generados también serán superfluos.