macOS и Linux
find
Реализация BSD на macOS отличается от GNU find - это совместимо как с BSD, так и с GNU find. Начните с полной реализации, используя -name
и -o
для или - Поместите эту функцию в ваш .bashrc
файл:
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
Затем cd
в каталог, который вы хотите рекурсивно очистить, и введите pyclean
.
GNU только для поиска
Это решение GNU find, only (то есть Linux), но я чувствую, что с регулярным выражением это немного лучше:
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
Любая платформа, использующая Python 3
В Windows вы, вероятно, даже не имеете find
. Однако у вас, вероятно, есть Python 3, который, начиная с 3.4, имеет удобный pathlib
модуль:
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
Флаг говорит Python не писать .pyc
файлы. (См. Также PYTHONDONTWRITEBYTECODE
переменную среды.)
Вышеперечисленные нарушения приводят к списку понятий для зацикливания, но при использовании python -c
стиль является скорее второстепенной задачей. В качестве альтернативы мы могли бы злоупотреблять (например) __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()"
Критика ответа
Верхний ответ говорил:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Это может показаться менее эффективным, потому что использует три процесса. find
принимает регулярное выражение, поэтому нам не нужен отдельный вызов grep
. Точно так же он есть -delete
, поэтому нам не нужен отдельный вызов rm
- и вопреки комментарию здесь, он будет удалять непустые каталоги, пока они очищаются благодаря совпадению с регулярным выражением.
Со xargs
страницы руководства :
find /tmp -depth -name core -type f -delete
Найдите файлы с именем core в каталоге / tmp или ниже и удалите их, но более эффективно, чем в предыдущем примере (потому что мы избегаем необходимости использовать fork (2) и exec (2) для запуска rm, и нам не нужно дополнительный процесс xargs).
*__pycache__
,*.pyc*
и это не делает различия между файлами и каталогами. Большинство сгенерированныхrm
команд также будут лишними.