macOS i Linux
find
Implementacja BSD w systemie macOS różni się od funkcji wyszukiwania GNU - jest zgodna zarówno z wyszukiwaniem BSD, jak i GNU. Zacznij od implementacji globalnej, używając -name
i -o
for or - Umieść tę funkcję w swoim .bashrc
pliku:
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
Następnie cd
do katalogu, który chcesz wyczyścić rekurencyjnie, i wpisz pyclean
.
Tylko do wyszukiwania GNU
To jest tylko znalezisko GNU (tj. Linux), ale wydaje mi się, że jest trochę ładniejsze z wyrażeniem regularnym:
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
Dowolna platforma, korzystająca z Pythona 3
W systemie Windows prawdopodobnie nawet nie masz find
. Prawdopodobnie masz jednak Python 3, który począwszy od 3.4 ma wygodny pathlib
moduł:
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__')]"
-B
Flaga mówi Python nie pisać .pyc
plików. (Zobacz także PYTHONDONTWRITEBYTECODE
zmienną środowiskową).
Powyższe nadużycia zawierają listę składni do zapętlenia, ale podczas używania python -c
styl jest raczej drugorzędnym problemem. Alternatywnie możemy nadużyć (na przykład) __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()"
Krytyka odpowiedzi
Najlepsza odpowiedź mówiła:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Wydawałoby się, że jest to mniej wydajne, ponieważ wykorzystuje trzy procesy. find
przyjmuje wyrażenie regularne, więc nie potrzebujemy osobnego wywołania grep
. Podobnie stało -delete
, więc nie ma potrzeby oddzielnego wywołanie rm
-I przeciwnie do komentarza tutaj, to będzie usuwać niepuste katalogi, tak długo, jak się opróżniane dzięki regularnym meczu ekspresji.
Ze strony podręcznika xargs
:
find /tmp -depth -name core -type f -delete
Znajdź pliki o nazwie core w katalogu / tmp lub poniżej i usuń je, ale wydajniej niż w poprzednim przykładzie (ponieważ unikamy konieczności używania fork (2) i exec (2) do uruchomienia rm i nie potrzebujemy dodatkowy proces xargs).
*__pycache__
,*.pyc*
i to nie rozróżnia plików i katalogów. Większość wygenerowanychrm
poleceń będzie również zbędna.