Reputation: 1711
I want to delete all files with the extension .bak
in a directory. How can I do that in Python?
Upvotes: 170
Views: 307871
Reputation: 709
Or using pathlib.Path:
from pathlib import Path
for file in Path("/path/to/folder").glob("*"):
file.unlink()
This way one also could specify to only delete files that match the glob pattern. For example: .glob("*.txt") to only remove text files.
And for a recursive removal of all files in subfolders just use rglob instead of glob. The following would delete all txt-files in the specified folder and all it's subfolders:
for file in Path("/path/to/folder").rglob("*.txt"):
file.unlink()
Upvotes: 0
Reputation: 598
For one line solution (Both Windows
and Linux
) ;
import glob,os
for file in glob.glob("<your_path>/*.bak"): print(file," these will be deleted")
if input("continue ?") == "Y":
for file in glob.glob("<your_path>/*.bak"): os.remove(file)
Upvotes: 0
Reputation: 188134
Via os.listdir
and os.remove
:
import os
filelist = [ f for f in os.listdir(mydir) if f.endswith(".bak") ]
for f in filelist:
os.remove(os.path.join(mydir, f))
Using only a single loop:
for f in os.listdir(mydir):
if not f.endswith(".bak"):
continue
os.remove(os.path.join(mydir, f))
Or via glob.glob
:
import glob, os, os.path
filelist = glob.glob(os.path.join(mydir, "*.bak"))
for f in filelist:
os.remove(f)
Be sure to be in the correct directory, eventually using os.chdir
.
Upvotes: 321
Reputation: 17
I realize this is old; however, here would be how to do so using just the os module...
def purgedir(parent):
for root, dirs, files in os.walk(parent):
for item in files:
# Delete subordinate files
filespec = os.path.join(root, item)
if filespec.endswith('.bak'):
os.unlink(filespec)
for item in dirs:
# Recursively perform this operation for subordinate directories
purgedir(os.path.join(root, item))
Upvotes: 1
Reputation: 14906
On Linux and macOS you can run simple command to the shell:
subprocess.run('rm /tmp/*.bak', shell=True)
Upvotes: -1
Reputation: 50135
In Python 3.5, os.scandir
is better if you need to check for file attributes or type - see os.DirEntry
for properties of the object that's returned by the function.
import os
for file in os.scandir(path):
if file.name.endswith(".bak"):
os.unlink(file.path)
This also doesn't require changing directories since each DirEntry
already includes the full path to the file.
Upvotes: 28
Reputation: 342859
you can create a function. Add maxdepth as you like for traversing subdirectories.
def findNremove(path,pattern,maxdepth=1):
cpath=path.count(os.sep)
for r,d,f in os.walk(path):
if r.count(os.sep) - cpath <maxdepth:
for files in f:
if files.endswith(pattern):
try:
print "Removing %s" % (os.path.join(r,files))
#os.remove(os.path.join(r,files))
except Exception,e:
print e
else:
print "%s removed" % (os.path.join(r,files))
path=os.path.join("/home","dir1","dir2")
findNremove(path,".bak")
Upvotes: 8
Reputation: 880607
Use os.chdir
to change directory .
Use glob.glob
to generate a list of file names which end it '.bak'. The elements of the list are just strings.
Then you could use os.unlink
to remove the files. (PS. os.unlink
and os.remove
are synonyms for the same function.)
#!/usr/bin/env python
import glob
import os
directory='/path/to/dir'
os.chdir(directory)
files=glob.glob('*.bak')
for filename in files:
os.unlink(filename)
Upvotes: 26