Teifion
Teifion

Reputation: 110959

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

I've renamed some files in a fairly large project and want to remove the .pyc files they've left behind. I tried the bash script:

 rm -r *.pyc

But that doesn't recurse through the folders as I thought it would. What am I doing wrong?

Upvotes: 746

Views: 382669

Answers (26)

mo-han
mo-han

Reputation: 427

There is the pyclean package on PyPI and Anaconda, which is easy to use and cross-platform.

python -m pip install pyclean

You then just need to run a simple command to clean all __pycache__ folders and *.pyc files in current dir:

pyclean .

It also has additional options to delete various artifacts from running builds and tests.

Upvotes: 5

Haribk
Haribk

Reputation: 189

In windows where find wont work. Here is a python function which can be run in ipython or python default interpretor or run as a script. Just putting for easy accessibility for some one.

from pathlib import Path
from os import remove

def remove_files(pth, filetype = "*.pyc"):
   pth = Path(pth)
   for file in pth.glob(f"**/{filetype}"):
   remove(file)

You can call the function as:

target_folder = <path to clean>
remove_files(target_folder)

Upvotes: 0

Handier Chan
Handier Chan

Reputation: 1

DEL /F /S /Q "Z:\aaa\*.pyc"
use cmd, or save in bat file, in window

Upvotes: 0

Fawaz
Fawaz

Reputation: 3560

Had to add a few ignore params on M1:

pyclean --verbose . --ignore "Library",".Trash"  

Upvotes: 0

Andy Baker
Andy Baker

Reputation: 21567

find . -name '*.pyc' -type f -delete

Surely the simplest.

Upvotes: 1074

Chance
Chance

Reputation: 535

py3clean works for me!

cd /usr/local/lib/python3.9
sudo py3clean -v .

Upvotes: 0

Abhishake Gupta
Abhishake Gupta

Reputation: 3170

To delete all the python compiled files in current directory.

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

Upvotes: 1

Milovan Tomašević
Milovan Tomašević

Reputation: 8663

If you want remove all *.pyc files and __pycache__ directories recursively in the current directory:

  • with python:
import os

os.popen('find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf')
  • or manually with terminal or cmd:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

Upvotes: 0

Girish Vas
Girish Vas

Reputation: 680

If you want to delete all the .pyc files from the project folder.

First, you have

cd <path/to/the/folder>

then find all the .pyc file and delete.

find . -name \*.pyc -delete

Upvotes: 2

Mithril
Mithril

Reputation: 13718

Further, people usually want to remove all *.pyc, *.pyo files and __pycache__ directories recursively in the current directory.

Command:

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

Upvotes: 15

gpap
gpap

Reputation: 2854

You can run find . -name "*.pyc" -type f -delete.

But use it with precaution. Run first find . -name "*.pyc" -type f to see exactly which files you will remove.

In addition, make sure that -delete is the last argument in your command. If you put it before the -name *.pyc argument, it will delete everything.

Upvotes: 1

Bill the Lizard
Bill the Lizard

Reputation: 405675

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

Upvotes: 1296

Kevin Sabbe
Kevin Sabbe

Reputation: 1452

if you don't want .pyc anymore you can use this single line in a terminal:

export PYTHONDONTWRITEBYTECODE=1

if you change your mind:

unset PYTHONDONTWRITEBYTECODE

Upvotes: 4

d0k
d0k

Reputation: 2580

If you're using bash >=4.0 (or zsh)

rm **/*.pyc

Note that */*.pyc selects all .pyc files in the immediate first-level subdirectories while **/*.pyc recursively scans the whole directory tree. As an example, foo/bar/qux.pyc will be deleted by rm **/*.pyc but not by */*.pyc.

The globstar shell options must be enabled. To enable globstar:

shopt -s globstar

and to check its status:

shopt globstar

Upvotes: 53

Yeo
Yeo

Reputation: 11784

Django Extension

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

python manage.py clean_pyc

The implementation can be viewed in its source code.

Upvotes: 11

haki
haki

Reputation: 9759

For windows users:

del /S *.pyc

Upvotes: 36

PiyusG
PiyusG

Reputation: 1157

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

Upvotes: 2

Michael Benin
Michael Benin

Reputation: 4332

First run:

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

Then add:

export PYTHONDONTWRITEBYTECODE=1

To ~/.profile

Upvotes: 3

Moxdata
Moxdata

Reputation: 160

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

This is faster than

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

Upvotes: 16

Wilfred Hughes
Wilfred Hughes

Reputation: 31141

Add to your ~/.bashrc:

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

This removes all .pyc and .pyo files, and __pycache__ directories. It's also very fast.

Usage is simply:

$ cd /path/to/directory
$ pyclean

Upvotes: 98

Ron Ziroby Romero
Ron Ziroby Romero

Reputation: 9449

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

The find recursively looks for *.pyc files. The xargs takes that list of names and sends it to rm. The -print0 and the -0 tell the two commands to seperate the filenames with null characters. This allows it to work correctly on file names containing spaces, and even a file name containing a new line.

The solution with -exec works, but it spins up a new copy of rm for every file. On a slow system or with a great many files, that'll take too long.

You could also add a couple more args:

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

iname adds case insensitivity, like *.PYC . The no-run-if-empty keeps you from getting an error from rm if you have no such files.

Upvotes: 18

miku
miku

Reputation: 188004

I used to use an alias for that:

$ which pycclean

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

Upvotes: 30

jb.
jb.

Reputation: 23955

In current version of debian you have pyclean script which is in python-minimal package.

Usage is simple:

pyclean .

Upvotes: 89

romuloigor
romuloigor

Reputation: 183

full recursive

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

Upvotes: 7

Clint Miller
Clint Miller

Reputation: 15371

Just to throw another variant into the mix, you can also use backquotes like this:

rm `find . -name *.pyc`

Upvotes: 8

Chris Lutz
Chris Lutz

Reputation: 75389

rm -r recurses into directories, but only the directories you give to rm. It will also delete those directories. One solution is:

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

find will find all *.pyc files recursively in the current directory, and the for loop will iterate through the list of files found, removing each one.

Upvotes: 2

Related Questions