关于bash:如何从项目中删除所有.pyc文件?

How do I remove all .pyc files from a project?

我在一个相当大的项目中重命名了一些文件,并希望删除它们留下的.pyc文件。我试过bash脚本:

1
 rm -r *.pyc

但这不会像我想象的那样在文件夹中重现。我做错什么了?


1
find . -name"*.pyc" -exec rm -f {} \;


find . -name '*.pyc' -delete

当然是最简单的。


在当前版本的debian中,您有pyclean脚本,它位于python-minimal包中。

用法很简单:

1
pyclean .


添加到您的~/.bashrc中:

1
2
3
4
pyclean () {
        find . -type f -name"*.py[co]" -delete
        find . -type d -name"__pycache__" -delete
}

这将删除所有.pyc和.pyo文件以及__pycache__目录。速度也很快。

用法很简单:

1
2
$ cd /path/to/directory
$ pyclean


如果使用bash>=4.0(或zsh)

1
rm **/*.pyc

注意,*/*.pyc选择直接一级子目录中的所有.pyc文件,而**/*.pyc递归扫描整个目录树。例如,foo/bar/qux.pyc将由rm **/*.pyc删除,而不是由*/*.pyc删除。

必须启用globstar外壳选项。启用globstar

1
shopt -s globstar

并检查其状态:

1
shopt globstar


我以前用化名:

1
2
3
$ which pycclean

pycclean is aliased to `find . -name"*.pyc" | xargs -I {} rm -v"{}"'


1
find . -name '*.pyc' -print0 | xargs -0 rm

查找以递归方式查找*.pyc文件。xargs接受该名称列表并将其发送给rm。-print0和-0告诉这两个命令用空字符分隔文件名。这使得它能够正确地处理包含空格的文件名,甚至包含新行的文件名。

带有-exec的解决方案可以工作,但它会为每个文件提供一个新的RM副本。在一个缓慢的系统或有大量文件,这将花费太长时间。

您还可以添加几个参数:

1
find . -iname '*.pyc' -print0 | xargs -0 --no-run-if-empty  rm

iname添加了不区分大小写,如*.pyc。如果没有这样的文件,那么no-run if-empty可以防止您从RM中得到错误。


对于Windows用户:

1
del /S *.pyc


1
$ find . -name '*.pyc' -delete

这比

1
$ find . -name"*.pyc" -exec rm -rf {} \;

此外,人们通常希望递归地删除当前目录中的所有*.pyc*.pyo文件和__pycache__目录。

命令:

1
find . | grep -E"(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf


Django延长线

Note: This answer is very specific to Django project that have already been using Django Extension.

1
python manage.py clean_pyc

可以在源代码中查看实现。


只需将另一个变体加入到组合中,您还可以使用这样的反引号:

1
rm `find . -name *.pyc`


全递归

1
2
ll **/**/*.pyc
rm **/**/*.pyc


第一次运行:

1
find . -type f -name"*.py[c|o]" -exec rm -f {} +

然后添加:

1
export PYTHONDONTWRITEBYTECODE=1

对轮廓


1
find . -name"*.pyc"|xargs rm -rf

如果您不再需要.pyc,您可以在终端中使用此单行:

1
export PYTHONDONTWRITEBYTECODE=1

如果你改变主意:

1
unset PYTHONDONTWRITEBYTECODE


rm -r递归到目录中,但只返回给rm的目录。它还将删除这些目录。一种解决方案是:

1
2
3
4
for i in $( find . -name *.pyc )
do
  rm $i
done

find将在当前目录中递归查找所有*.pyc文件,for循环将遍历找到的文件列表,删除每个文件。


你可以运行find . -name"*.pyc" -type f -delete

但要小心使用。运行第一个find . -name"*.pyc" -type f查看您要删除的文件。

此外,请确保-delete是命令中的最后一个参数。如果将它放在-name*.pyc参数之前,它将删除所有内容。