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команд также будут лишними.