我在一个相当大的项目中重命名了一些文件,并希望删除他们留下的.pyc文件 . 我尝试了bash脚本:
rm -r *.pyc
但是这并没有像我想象的那样通过文件夹递归 . 我究竟做错了什么?
如果你不再需要.pyc,你可以在终端中使用这一行:
export PYTHONDONTWRITEBYTECODE=1
如果你改变主意:
unset PYTHONDONTWRITEBYTECODE
你可以运行 find . -name "*.pyc" -type f -delete .
find . -name "*.pyc" -type f -delete
但要谨慎使用它 . 首先运行 find . -name "*.pyc" -type f 以确切地查看要删除的文件 .
find . -name "*.pyc" -type f
此外,请确保-delete是命令中的最后一个参数 . 如果你把它放在-name * .pyc参数之前,它将删除所有内容 .
find . -name "*.pyc" -exec rm -f {} \;
find . -name '*.pyc' -delete
当然最简单 .
在当前版本的debian中,您有 pyclean 脚本,该脚本位于 python-minimal 包中 .
pyclean
python-minimal
用法很简单:
pyclean .
添加到 ~/.bashrc :
~/.bashrc
pyclean () { find . -type f -name "*.py[co]" -delete find . -type d -name "__pycache__" -delete }
这将删除所有.pyc和.pyo文件以及 __pycache__ 目录 . 它也非常快 .
__pycache__
$ cd /path/to/directory $ pyclean
如果你正在使用bash> = 4.0(或zsh)
rm **/*.pyc
请注意 */*.pyc 选择直接的第一级子目录中的所有 .pyc 文件,而 **/*.pyc 递归扫描整个目录树 . 例如, foo/bar/qux.pyc 将删除 foo/bar/qux.pyc ,但 */*.pyc 不会删除 foo/bar/qux.pyc .
*/*.pyc
.pyc
**/*.pyc
foo/bar/qux.pyc
必须启用globstar shell选项 . 要启用 globstar :
globstar
shopt -s globstar
并检查其状态:
shopt globstar
我过去常常使用别名:
$ which pycclean pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'
find . -name '*.pyc' -print0 | xargs -0 rm
查找以递归方式查找* .pyc文件 . xargs获取名称列表并将其发送到rm . -print0和-0告诉两个命令用空字符分隔文件名 . 这允许它在包含空格的文件名上正常工作,甚至包含新行的文件名 .
使用-exec的解决方案可以正常工作,但它会为每个文件创建一个rm的新副本 . 在慢速系统或大量文件上,这将花费太长时间 .
你还可以添加几个args:
find . -iname '*.pyc' -print0 | xargs -0 --no-run-if-empty rm
iname添加不区分大小写,如* .PYC . 如果没有这样的文件,no-run-if-empty可以防止你从rm获得错误 .
$ find . -name '*.pyc' -delete
这比快
$ find . -name "*.pyc" -exec rm -rf {} \;
对于Windows用户:
del /S *.pyc
只是为了在混合中添加另一个变体,你也可以使用这样的反引号:
rm `find . -name *.pyc`
注意:这个答案非常特定于已经使用Django Extension的Django项目 .
python manage.py clean_pyc
可以在its source code中查看实施情况 .
完全递归
ll **/**/*.pyc rm **/**/*.pyc
此外,人们通常希望在当前目录中递归删除所有 *.pyc , *.pyo 文件和 __pycache__ 目录 .
*.pyc
*.pyo
命令:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
第一次运行:
find . -type f -name "*.py[c|o]" -exec rm -f {} +
然后加:
至〜/ .profile
rm -r 递归到目录,但仅递归到 rm 的目录 . 它还将删除这些目录 . 一个解决方案是:
rm -r
rm
for i in $( find . -name *.pyc ) do rm $i done
find 将在当前目录中递归查找所有* .pyc文件, for 循环将遍历找到的文件列表,删除每个文件 .
find
for
find . -name "*.pyc"|xargs rm -rf
18 回答
如果你不再需要.pyc,你可以在终端中使用这一行:
如果你改变主意:
你可以运行
find . -name "*.pyc" -type f -delete
.但要谨慎使用它 . 首先运行
find . -name "*.pyc" -type f
以确切地查看要删除的文件 .此外,请确保-delete是命令中的最后一个参数 . 如果你把它放在-name * .pyc参数之前,它将删除所有内容 .
find . -name '*.pyc' -delete
当然最简单 .
在当前版本的debian中,您有
pyclean
脚本,该脚本位于python-minimal
包中 .用法很简单:
添加到
~/.bashrc
:这将删除所有.pyc和.pyo文件以及
__pycache__
目录 . 它也非常快 .用法很简单:
如果你正在使用bash> = 4.0(或zsh)
请注意
*/*.pyc
选择直接的第一级子目录中的所有.pyc
文件,而**/*.pyc
递归扫描整个目录树 . 例如,foo/bar/qux.pyc
将删除foo/bar/qux.pyc
,但*/*.pyc
不会删除foo/bar/qux.pyc
.必须启用globstar shell选项 . 要启用
globstar
:并检查其状态:
我过去常常使用别名:
查找以递归方式查找* .pyc文件 . xargs获取名称列表并将其发送到rm . -print0和-0告诉两个命令用空字符分隔文件名 . 这允许它在包含空格的文件名上正常工作,甚至包含新行的文件名 .
使用-exec的解决方案可以正常工作,但它会为每个文件创建一个rm的新副本 . 在慢速系统或大量文件上,这将花费太长时间 .
你还可以添加几个args:
iname添加不区分大小写,如* .PYC . 如果没有这样的文件,no-run-if-empty可以防止你从rm获得错误 .
这比快
对于Windows用户:
只是为了在混合中添加另一个变体,你也可以使用这样的反引号:
Django扩展
可以在its source code中查看实施情况 .
完全递归
此外,人们通常希望在当前目录中递归删除所有
*.pyc
,*.pyo
文件和__pycache__
目录 .命令:
第一次运行:
然后加:
至〜/ .profile
rm -r
递归到目录,但仅递归到rm
的目录 . 它还将删除这些目录 . 一个解决方案是:find
将在当前目录中递归查找所有* .pyc文件,for
循环将遍历找到的文件列表,删除每个文件 .