如何从项目中删除所有.pyc文件?

Tei*_*ion 652 bash

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

 rm -r *.pyc
Run Code Online (Sandbox Code Playgroud)

但是这并没有像我想象的那样通过文件夹递归.我究竟做错了什么?

Bil*_*ard 1125

find . -name "*.pyc" -exec rm -f {} \;
Run Code Online (Sandbox Code Playgroud)

  • Find有一个内置的"-delete"动作,所以你可以只做"找到".-name\*.pyc -delete` (366认同)
  • 最重要的是,如果这是一台开发机器,你可以设置PYTHONDONTWRITEBYTECODE = True,你永远不需要再这样做了.请参阅:[此答案](http://stackoverflow.com/questions/154443/how-to-avoid-pyc-files/154617#154617). (48认同)
  • `-delete`不是POSIX规范的一部分,并且不能保证在`find`的所有实现中都存在. (20认同)
  • 如果你害怕 - 这可能是好的 - 使用-exec echo {}进行第一次传递,或者 - 如果你非常*害怕 - 使用rm -i {}每次询问你或rm - v {}所以你看看你删除了什么. (6认同)
  • 你没有引用`{}`.如果意外地分词并删除了一个恰好被称为路径片段的中间路径,会发生什么? (5认同)

And*_*ker 993

find . -name '*.pyc' -delete

当然最简单.

  • +1.这个命令比比尔蜥蜴目前接受的命令更安全.任何带有`rm -rf`的命令都有点吓人.:) (93认同)
  • 如果你的`find`版本支持`-delete`; 它不是POSIX标准的一部分. (20认同)
  • 另外,请考虑"-r"在这里完全没必要."rm -f"就足够了. (13认同)
  • `-name'*.py?'`包括`.pyo,.pyc,...` (3认同)
  • 这会忽略.pyo文件和`__pycache__`目录.看我的回答. (2认同)
  • 请确保-delete是命令中的最后一件事。我不小心在发现之后放了-delete。它删除了所有内容! (2认同)

jb.*_*jb. 84

在debian的当前版本中,您有包中的pyclean脚本python-minimal.

用法很简单:

pyclean .
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,pyclean似乎只删除了.pyc文件,其中有相应的.py文件(至少在我的系统上 - ubuntu 12.10.)这意味着它在源文件被删除而你想要的情况下不是很有用清理剩余的.pyc文件. (34认同)

Wil*_*hes 79

添加到您的~/.bashrc:

pyclean () {
        find . -type f -name "*.py[co]" -delete
        find . -type d -name "__pycache__" -delete
}
Run Code Online (Sandbox Code Playgroud)

这将删除所有.pyc和.pyo文件和__pycache__目录.它也非常快.

用法很简单:

$ cd /path/to/directory
$ pyclean
Run Code Online (Sandbox Code Playgroud)


d0k*_*d0k 53

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

rm **/*.pyc
Run Code Online (Sandbox Code Playgroud)

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

必须启用globstar shell选项.启用globstar:

shopt -s globstar
Run Code Online (Sandbox Code Playgroud)

并检查其状态:

shopt globstar
Run Code Online (Sandbox Code Playgroud)


mik*_*iku 30

我过去常常使用别名:

$ which pycclean

pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'
Run Code Online (Sandbox Code Playgroud)

  • 在目前的debian中它是pyclean. (12认同)
  • 这并不能很好地处理文件名中的空格.你应该使用`find -print0`和`xargs -0`代替. (7认同)
  • 为什么要在文件/文件夹名称中包含带空格的python代码?这在语法上是合法的吗? (2认同)

hak*_*aki 21

对于Windows用户:

del /S *.pyc
Run Code Online (Sandbox Code Playgroud)


Ron*_*ero 18

find . -name '*.pyc' -print0 | xargs -0 rm
Run Code Online (Sandbox Code Playgroud)

查找以递归方式查找*.pyc文件.xargs获取名称列表并将其发送到rm.-print0和-0告诉两个命令用空字符分隔文件名.这允许它在包含空格的文件名上正常工作,甚至包含新行的文件名.

使用-exec的解决方案可以正常工作,但它会为每个文件创建一个rm的新副本.在一个慢速系统或许多文件上,这将花费太长时间.

你还可以添加几个args:

find . -iname '*.pyc' -print0 | xargs -0 --no-run-if-empty  rm
Run Code Online (Sandbox Code Playgroud)

iname添加不区分大小写,如*.PYC.如果没有这样的文件,no-run-if-empty可以防止rm收到错误.


小智 15

$ find . -name '*.pyc' -delete
Run Code Online (Sandbox Code Playgroud)

这比快

$ find . -name "*.pyc" -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)


Mit*_*ril 10

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

命令:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)


Cli*_*ler 8

只是为了在混合中添加另一个变体,你也可以使用这样的反引号:

rm `find . -name *.pyc`
Run Code Online (Sandbox Code Playgroud)

  • 如果有太多的匹配,这有一个失败的轻微缺点,因为将有太多的参数传递给`rm`. (4认同)

Yeo*_*Yeo 8

Django扩展

注意:这个答案非常特定于已经使用Django Extension的Django项目.

python manage.py clean_pyc
Run Code Online (Sandbox Code Playgroud)

可以在其源代码中查看实现.


rom*_*gor 7

完全递归

ll **/**/*.pyc
rm **/**/*.pyc
Run Code Online (Sandbox Code Playgroud)

  • 一组"**"是多余的,并且在`d0k`的答案中,你必须在bash 4+中启用globstar才能按预期工作.即做`shopt -s globstar`或在你的一个来源bash中拥有它.文件. (3认同)

mo-*_*han 5

现在PyPI上有一个包pyclean,它易于使用,并且跨平台。用户只需要一个简单的命令行即可清理__pycache__当前目录中的所有文件:

pyclean .
Run Code Online (Sandbox Code Playgroud)