Reputation: 110959
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
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
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
Reputation: 1
DEL /F /S /Q "Z:\aaa\*.pyc"
use cmd, or save in bat file, in window
Upvotes: 0
Reputation: 3560
Had to add a few ignore params on M1:
pyclean --verbose . --ignore "Library",".Trash"
Upvotes: 0
Reputation: 535
py3clean
works for me!
cd /usr/local/lib/python3.9
sudo py3clean -v .
Upvotes: 0
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
Reputation: 8663
If you want remove all *.pyc
files and __pycache__
directories recursively in the current directory:
import os
os.popen('find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf')
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Upvotes: 0
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
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
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
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
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
Reputation: 11784
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
Reputation: 4332
First run:
find . -type f -name "*.py[c|o]" -exec rm -f {} +
Then add:
export PYTHONDONTWRITEBYTECODE=1
To ~/.profile
Upvotes: 3
Reputation: 160
$ find . -name '*.pyc' -delete
This is faster than
$ find . -name "*.pyc" -exec rm -rf {} \;
Upvotes: 16
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
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
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
Reputation: 23955
In current version of debian you have pyclean
script which is in python-minimal
package.
Usage is simple:
pyclean .
Upvotes: 89
Reputation: 15371
Just to throw another variant into the mix, you can also use backquotes like this:
rm `find . -name *.pyc`
Upvotes: 8
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