Aaron Hall..
61
macOS和Linux
BSD find在macOS上的实现与GNU find不同 - 这与BSD和GNU find都兼容.从一个globbing实现开始,使用-name和-ofor 或 - 将此函数放入您的.bashrc文件中:
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
然后cd到要递归清理的目录,然后键入pyclean.
GNU find-only
这是一个GNU查找,只有(即Linux)解决方案,但我觉得正则表达式更好一点:
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
任何平台,使用Python 3
在Windows上,你甚至可能没有find.但是,你可能有Python 3,从3.4开始有一个方便的pathlib模块:
python3 -c "import pathlib; [p.unlink() for p in pathlib.Path('.').rglob('*.py[co]')]"
python3 -c "import pathlib; [p.rmdir() for p in pathlib.Path('.').rglob('__pycache__')]"
这会滥用列表对循环的理解,但在使用时python -c,样式是次要问题.或者我们可以滥用(例如)__import__:
python3 -c "for p in __import__('pathlib').Path('.').rglob('*.py[co]'): p.unlink()"
python3 -c "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中或下面找到名为core的文件并删除它们,但比前一个示例更有效(因为我们避免使用fork(2)和exec(2)来启动rm而我们不需要额外的xargs过程).