macOS e Linux
BSD's find
implementação no macOS é diferente da localização do GNU - é compatível com a localização do BSD e do GNU. Comece com uma implementação globbing, usando -name
e -o
for ou - Coloque esta função no seu .bashrc
arquivo:
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
Em seguida, vá cd
para o diretório que você deseja limpar recursivamente e digite pyclean
.
Somente localização GNU
Esta é uma solução GNU find, only (ou seja, Linux), mas acho que é um pouco melhor com o regex:
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
Qualquer plataforma, usando Python 3
No Windows, você provavelmente nem tem find
. No entanto, você provavelmente possui o Python 3, que a partir do 3.4 possui o 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__')]"
o -B
bandeira diz ao Python para não gravar .pyc
arquivos. (Veja também a PYTHONDONTWRITEBYTECODE
variável de ambiente.)
Os abusos acima listam compreensões para loop, mas ao usar python -c
, o estilo é uma preocupação secundária. Como alternativa, podemos abusar (por exemplo) __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 uma resposta
A resposta principal costumava dizer:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Isso parece ser menos eficiente porque usa três processos. find
usa uma expressão regular; portanto, não precisamos de uma chamada separada de grep
. Da mesma forma, tem -delete
, por isso, não precisa de uma invocação separada do rm
contrário -e a um comentário aqui, ele vai excluir diretórios não vazios desde que eles se esvaziado em virtude da correspondência de expressão regular.
Na xargs
página do manual:
find /tmp -depth -name core -type f -delete
Localize os arquivos denominados core no diretório / tmp ou abaixo dele e exclua-os, mas com mais eficiência do que no exemplo anterior (porque evitamos a necessidade de usar fork (2) e exec (2) para iniciar a rm e não precisamos do processo extra xargs).
*__pycache__
,*.pyc*
e não faz distinção entre arquivos e diretórios. A maioria dosrm
comandos gerados também será supérflua.