macOS та Linux
find
Реалізація BSD на macOS відрізняється від пошуку GNU - це сумісно як з BSD, так і з GNU. Почніть з глобальної реалізації, використовуючи -name
та -o
для або - Покладіть цю функцію у свій .bashrc
файл:
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
Потім cd
в каталог, який потрібно рекурсивно очистити, і введіть pyclean
.
GNU - лише знахідка
Це єдине (тобто Linux) рішення GNU, але я вважаю, що це трохи приємніше з регулярним виразом:
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
Знайдіть файли з ім’ям ядра в каталозі / tmp або нижче та видаліть їх, але ефективніше, ніж у попередньому прикладі (адже ми уникаємо необхідності використовувати fork (2) та exec (2) для запуску rm, і нам не потрібен додатковий процес xargs).
*__pycache__
,*.pyc*
і він не розрізняє файли та каталоги. Більшість створенихrm
команд також буде зайвою.