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


677

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

 rm -r *.pyc

但这并没有像我想的那样遍历文件夹。我究竟做错了什么?


11
这是行不通的,因为在UNIX中,glob由shell扩展,而不是由正在运行的程序扩展。如果当前目录中有a.pyc和b.pyc,目录foo和bar,rm则将使用参数[-r,a.pyc,b.pyc]进行调用。
ephemient

1
如果您担心将代码推送给其他人,则可以将其添加到.gitignore中,**/*.pyc那么您就不必再担心它了
bubakazouba 2015年

Answers:


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

384
Find具有内置的“删除”操作,因此您可以执行以下操作find . -name \*.pyc -delete
Christoffer,2009年

51
最重要的是,如果这是一台开发机,则可以设置PYTHONDONTWRITEBYTECODE = True,而您将不再需要这样做。请参阅:此答案
mlissner's

5
您没有报价{}。如果不小心分词并删除了一条中间路径,而该中间路径恰好像您找到的路径的一部分一样被调用,将会发生什么情况?
Robottinosino

20
-delete不是POSIX规范的一部分,也不保证在的所有实现中都存在find
chepner

7
如果您害怕-可能很好-使用-exec echo {}进行第一遍,或者-如果您非常害怕-使用rm -i {}每次询问您或rm-v {},这样您就可以看到您删除。
jeanM 2014年

1021

find . -name '*.pyc' -delete

当然最简单。


21
如果您的版本find支持-delete; 它不是POSIX标准的一部分。
chepner

4
这将忽略.pyo文件和__pycache__目录。看我的答案。
Wilfred Hughes 2014年

我使用了接受的答案中的代码,它起作用了,但是这些命令更短,更简单
Dap 2014年

3
-name '*.py?'包括.pyo, .pyc,...
cdosborn

2
请确保-delete是命令中的最后一件事。我不小心在发现之后放了-delete。它删除了所有内容!
thinkanotherone

85

当前版本的debian中包含pyclean脚本python-minimal

用法很简单:

pyclean .

34
值得注意的是,pyclean似乎仅删除具有相应.py文件的.pyc文件(至少在我的系统上-ubuntu 12.10。)这意味着在删除源文件并且您想要清理剩余的.pyc文件。
tigerFinch 2013年

@holms pyclean(和现在py3clean)起源于Debian软件包,因此不在RHEL中。
duozmo

83

添加到您的~/.bashrc

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

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

用法很简单:

$ cd /path/to/directory
$ pyclean

find . -type d -name "__pycache__" -delete经常会警告您缺少路径,因为显然在删除文件夹之前,内容会添加到队列中。2>/dev/null应该解决这个问题。
疯狂物理学家,

53

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

rm **/*.pyc

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

必须启用globstar shell选项。要启用globstar

shopt -s globstar

并检查其状态:

shopt globstar

1
rm **/*.pycvs vs 跑步有什么区别rm */*.pyc?(后者似乎在本地为我工作。)
Taylor Edmiston,2015年

1
@TaylorEdmiston rm */*.pyc将删除.pyc深度1的所有子目录中的rm **/*.pyc所有.pyc文件。将删除深度0+的所有子目录中的所有文件
Adam Stewart

@AdamStewart感谢您添加此内容。对于其他在此线程上绊脚石的人,我遇到的问题是OS X随附的Apple bash不包含globstar(因此***当运行时,运行时shopt globstar抛出错误)。
泰勒·埃德米斯顿

30

我曾经为此使用别名:

$ which pycclean

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

12
在当前的debian中,它是pyclean。
jb。

7
这不能很好地处理文件名中的空格。您应该使用find -print0xargs -0代替。
r3m0t13年

2
您为什么要在文件/文件夹名称中使用带空格的python代码?这在语法上合法吗?
coredumperror 2015年

@CoreDumpError,是的,实际上,在Windows上,Python安装到带空格的目录(“程序文件”)。
Paul Draper

python解释器可能默认安装在此处,但这并不是放置代码的好地方。另外,您当然不希望Program Files文件夹成为您包结构的一部分,这就是为什么我对语法保持警惕的原因。
coredumperror

24

对于Windows用户:

del /S *.pyc

将其放在批处理脚本中使事情变得非常简单。谢谢。
Nick Gotch

如果您使用的是Powershell,则可以将其与“ cmd”-> Run command->“ exit”一起使用。
np8

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

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

使用-exec的解决方案有效,但是它为每个文件启动了一个新的rm副本。在速度较慢的系统上或有大量文件的情况下,这将花费很长时间。

您还可以添加更多的参数:

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

iname增加了大小写不敏感,例如* .PYC。如果没有此类文件,no-run-if-empty可以防止您从rm中获取错误。


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

这比

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

11

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

命令:

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

这是一个很好的答案,但是普通的Python解决方案将是跨平台的,因此是可取的。虽然我个人并不关心Windows,但可能有一半的Python人口生活在Windows上findgrep并且和朋友在那儿不工作。
Peterino '19

如果您安装工具,它们就会执行。我建议每个Windows用户CLI这样做,以减轻跨COMPAT:superuser.com/questions/168202/...
DylanYoung

8

只需将另一个变体添加到组合中,您还可以使用反引号,如下所示:

rm `find . -name *.pyc`

5
如果有太多的匹配项,则有一个轻微的缺点,即失败,因为将传递给的参数过多rm
chepner


7

完全递归

ll **/**/*.pyc
rm **/**/*.pyc

有趣的是,这与安迪和比尔的答案相比如何?
奥斯汀·亨利

3
一组**是多余的,如d0k的答案所示,您必须在bash 4+中启用globstar才能使其按预期工作。即shopt -s globstar在您的一个bash中做或拥有它。文件。
恢复莫妮卡

1
ll通常也被别名为ls -l,但实际上不是命令或可移植的。因此,要递归列出中的所有.pyc文件.,您应该改为echo **/*.pyc启用globstar之类的方法
恢复莫妮卡,请

3

第一次运行:

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

然后加:

export PYTHONDONTWRITEBYTECODE=1

到〜/ .profile



2

rm -r递归到目录,但只有您指定的目录rm。它还将删除这些目录。一种解决方案是:

for i in $( find . -name *.pyc )
do
  rm $i
done

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


尽管我必须将其放入.sh文件并运行它(我很好,我将多次使用此命令)

我相信将所有内容放在用';'分隔的一行上应该可以在shell上运行它。但是,当我在bash中键入该内容时,bash会在最后等待“完成”以执行任何操作……
Chris Lutz

这是一种糟糕的反模式(也是一种非常常见的反模式,我希望它会消失):它被包含空格或glob字符的文件名破坏。而且它忽略的地步find,其-exec谓语:find . -name '*.pyc' -exec rm {} +(更好的,更短,更安全,更健壮,更有效)。
gniourf_gniourf


1

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

但是请谨慎使用。首先运行,find . -name "*.pyc" -type f以查看要删除的文件。

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


0

如果要从项目文件夹中删除所有.pyc文件。

首先,你有

cd <path/to/the/folder>

然后找到所有.pyc文件并删除。

find . -name \*.pyc -delete
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.