¿Cómo elimino todos los archivos .pyc de un proyecto?

He cambiado el nombre de algunos archivos en un proyecto bastante grande y quiero eliminar los archivos .pyc que han dejado atrás. Probé el guión bash:

rm -r *.pyc 

Pero eso no se repite a través de las carpetas como pensé que sería. ¿Qué estoy haciendo mal?

 find . -name "*.pyc" -exec rm -f {} \; 

find . -name '*.pyc' -delete

Seguramente el más simple.

En la versión actual de Debian, tiene el script pyclean que está en el paquete python-minimal .

El uso es simple:

 pyclean . 

Agregue a su ~/.bashrc :

 pyclean () { find . -type f -name "*.py[co]" -delete find . -type d -name "__pycache__" -delete } 

Esto elimina todos los archivos .pyc y .pyo, y los directorios __pycache__ . También es muy rápido.

El uso es simple:

 $ cd /path/to/directory $ pyclean 

Si usa bash> = 4.0 (o zsh)

 rm **/*.pyc 

Tenga en cuenta que */*.pyc selecciona todos los .pyc */*.pyc en los subdirectorios inmediatos de primer nivel, mientras que **/*.pyc escanea de forma recursiva todo el árbol de directorios. Como ejemplo, foo/bar/qux.pyc será eliminado por rm **/*.pyc pero no por */*.pyc .

Las opciones del shell globstar deben estar habilitadas. Para habilitar globstar :

 shopt -s globstar 

y para verificar su estado:

 shopt globstar 

Solía ​​usar un alias para eso:

 $ which pycclean pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"' 
 find . -name '*.pyc' -print0 | xargs -0 rm 

El buscador busca recursivamente los archivos * .pyc. El xargs toma esa lista de nombres y la envía a rm. El -print0 y el -0 indican los dos comandos para separar los nombres de archivo con caracteres nulos. Esto le permite funcionar correctamente en los nombres de archivos que contienen espacios, e incluso en un nombre de archivo que contiene una nueva línea.

La solución con -exec funciona, pero genera una nueva copia de rm para cada archivo. En un sistema lento o con muchos archivos, tomará demasiado tiempo.

También podría agregar un par de argumentos más:

 find . -iname '*.pyc' -print0 | xargs -0 --no-run-if-empty rm 

iname agrega insensibilidad de mayúsculas y minúsculas, como * .PYC. El no-run-if-empty evita que obtenga un error de rm si no tiene dichos archivos.

 $ find . -name '*.pyc' -delete 

Esto es más rápido que

 $ find . -name "*.pyc" -exec rm -rf {} \; 

Para usuarios de Windows:

 del /S *.pyc 

Solo para agregar otra variante a la mezcla, también puede usar las comillas inversas como esta:

 rm `find . -name *.pyc` 

recursivo completo

 ll **/**/*.pyc rm **/**/*.pyc 

Extensión Django

Nota: Esta respuesta es muy específica para el proyecto Django que ya ha estado usando Django Extension .

 python manage.py clean_pyc 

La implementación se puede ver en su código fuente .

Además, la gente generalmente quiere eliminar todos los directorios *.pyo , *.pyo y __pycache__ recursivamente en el directorio actual.

Mando:

 find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf 

Primer bash:

 find . -type f -name "*.py[c|o]" -exec rm -f {} + 

Luego añade:

 export PYTHONDONTWRITEBYTECODE=1 

Para ~ / .profile

rm -r recurre a los directorios, pero solo a los directorios que le das a rm . También eliminará esos directorios. Una solución es:

 for i in $( find . -name *.pyc ) do rm $i done 

find encontrará todos los archivos * .pyc de forma recursiva en el directorio actual, y el ciclo for iterará a través de la lista de archivos encontrados, eliminando cada uno.

 find . -name "*.pyc"|xargs rm -rf 

si ya no quieres .pyc, puedes usar esta única línea en una terminal:

 export PYTHONDONTWRITEBYTECODE=1 

si cambias tu mente:

 unset PYTHONDONTWRITEBYTECODE