我在一个相当大的项目中重命名了一些文件,并希望删除他们留下的.pyc文件。我尝试了bash脚本:
rm -r *.pyc
但是这并没有像我想象的那样通过文件夹递归。我做错了什么?
答案 0 :(得分:1083)
find . -name "*.pyc" -exec rm -f {} \;
答案 1 :(得分:969)
find . -name '*.pyc' -delete
当然最简单。
答案 2 :(得分:82)
在当前版本的debian中,您有pyclean
个python-minimal
包中的脚本。
用法很简单:
pyclean .
答案 3 :(得分:77)
添加到您的~/.bashrc
:
pyclean () {
find . -type f -name "*.py[co]" -delete
find . -type d -name "__pycache__" -delete
}
这将删除所有.pyc和.pyo文件以及__pycache__
目录。它也非常快。
用法很简单:
$ cd /path/to/directory
$ pyclean
答案 4 :(得分:51)
如果您使用的是bash> = 4.0(或zsh)
rm **/*.pyc
请注意*/*.pyc
选择直接的第一级子目录中的所有.pyc
个文件,而**/*.pyc
递归扫描整个目录树。例如,foo/bar/qux.pyc
将删除rm **/*.pyc
,但*/*.pyc
不会删除。{/ p>
必须启用globstar shell选项。启用globstar
:
shopt -s globstar
并检查其状态:
shopt globstar
答案 5 :(得分:30)
我过去常常使用别名:
$ which pycclean
pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'
答案 6 :(得分:17)
find . -name '*.pyc' -print0 | xargs -0 rm
find以递归方式查找* .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中获得错误。
答案 7 :(得分:16)
对于Windows用户:
del /S *.pyc
答案 8 :(得分:15)
$ find . -name '*.pyc' -delete
这比
更快$ find . -name "*.pyc" -exec rm -rf {} \;
答案 9 :(得分:9)
此外,人们通常希望在当前目录中递归删除所有*.pyc
,*.pyo
文件和__pycache__
目录。
命令:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
答案 10 :(得分:8)
只需将另一个变体添加到混音中,您也可以使用这样的反引号:
rm `find . -name *.pyc`
答案 11 :(得分:8)
注意:此答案非常具体针对已经使用Django project的 Django Extension 。
CREATE OR REPLACE FUNCTION copy_tables(_tbls regclass[])
RETURNS void AS
$func$
DECLARE
_tbl regclass;
_id_pairs hstore;
_table_id_pairs hstore;
_row record;
BEGIN
FOR _tbl IN SELECT _tbls
LOOP
EXECUTE format('SELECT copy_rows_from_table(''%1$s'')', _tbl)
INTO _table_id_pairs;
SELECT COALESCE(_id_pairs, hstore('')) || COALESCE(_table_id_pairs, hstore('')) INTO _id_pairs;
END LOOP;
FOR _tbl IN SELECT _tbls
LOOP
FOR _row IN EXECUTE format('SELECT * FROM %1$s WHERE id = ANY(''%2$s''::uuid[])', _tbl, avals(_id_pairs))
LOOP
EXECUTE (
SELECT format('UPDATE %1$s SET (%2$s) = (%3$s) WHERE id = %4$s'
, _tbl, string_agg(quote_ident(attname), ', '),
string_agg(COALESCE(_id_pairs -> ('_row.' || quote_ident(attname)), '_row.' || quote_ident(attname)), ', '), _row.id)
FROM pg_attribute
WHERE attrelid = _tbl
AND NOT attisdropped
AND attnum > 0
AND attname LIKE '%_id'
);
END LOOP;
END LOOP;
END
$func$
LANGUAGE plpgsql;
可以在its source code中查看实施情况。
答案 12 :(得分:7)
完全递归
ll **/**/*.pyc
rm **/**/*.pyc
答案 13 :(得分:3)
首先运行:
find . -type f -name "*.py[c|o]" -exec rm -f {} +
然后添加:
export PYTHONDONTWRITEBYTECODE=1
至〜/ .profile
答案 14 :(得分:3)
如果您不再需要.pyc,可以在终端中使用此单行:
export PYTHONDONTWRITEBYTECODE=1
如果你改变主意:
unset PYTHONDONTWRITEBYTECODE
答案 15 :(得分:2)
rm -r
递归到目录,但仅递归到rm
的目录。它还将删除这些目录。一个解决方案是:
for i in $( find . -name *.pyc )
do
rm $i
done
find
将在当前目录中递归找到所有* .pyc文件,for
循环将遍历找到的文件列表,删除每个文件。
答案 16 :(得分:2)
find . -name "*.pyc"|xargs rm -rf
答案 17 :(得分:1)
您可以运行find . -name "*.pyc" -type f -delete
。
但请谨慎使用。首先运行find . -name "*.pyc" -type f
,以查看要删除的文件。
此外,请确保-delete是命令中的最后一个参数。如果将其放在-name * .pyc参数之前,它将删除所有内容。
答案 18 :(得分:1)
删除当前目录下所有python编译文件。
find . -name "__pycache__"|xargs rm -rf
find . -name "*.pyc"|xargs rm -rf
答案 19 :(得分:0)
如果要从项目文件夹中删除所有.pyc文件。
首先,您有
cd <path/to/the/folder>
然后找到所有.pyc文件并删除。
find . -name \*.pyc -delete
答案 20 :(得分:0)
如果要递归删除当前目录中的所有 *.pyc
文件和 __pycache__
目录:
import os
os.popen('find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf')
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
答案 21 :(得分:0)
现在PyPI上有一个包pyclean,使用方便,跨平台。用户只需要一个简单的命令行来清理当前目录中的所有 __pycache__
文件:
pyclean .