Skip to content

Instantly share code, notes, and snippets.

@jacobtomlinson
Last active October 19, 2022 04:56
Show Gist options
  • Star 27 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save jacobtomlinson/9031697 to your computer and use it in GitHub Desktop.
Save jacobtomlinson/9031697 to your computer and use it in GitHub Desktop.
Python Recursively Remove Empty Directories
#! /usr/bin/env python
'''
Module to remove empty folders recursively. Can be used as standalone script or be imported into existing script.
'''
import os, sys
def removeEmptyFolders(path, removeRoot=True):
'Function to remove empty folders'
if not os.path.isdir(path):
return
# remove empty subfolders
files = os.listdir(path)
if len(files):
for f in files:
fullpath = os.path.join(path, f)
if os.path.isdir(fullpath):
removeEmptyFolders(fullpath)
# if folder empty, delete it
files = os.listdir(path)
if len(files) == 0 and removeRoot:
print "Removing empty folder:", path
os.rmdir(path)
def usageString():
'Return usage string to be output in error cases'
return 'Usage: %s directory [removeRoot]' % sys.argv[0]
if __name__ == "__main__":
removeRoot = True
if len(sys.argv) < 1:
print "Not enough arguments"
sys.exit(usageString())
if not os.path.isdir(sys.argv[1]):
print "No such directory %s" % sys.argv[1]
sys.exit(usageString())
if len(sys.argv) == 2 and sys.argv[2] != "False":
print "removeRoot must be 'False' or not set"
sys.exit(usageString())
else:
removeRoot = False
removeEmptyFolders(sys.argv[1], removeRoot)
@alexwhb
Copy link

alexwhb commented Jul 28, 2016

you saved me a bunch of time with this. Thank you. 👍

@MaynardTool
Copy link

Nice one. Thanks very much!

@macosas
Copy link

macosas commented Apr 20, 2017

Thank you very much, work so fine.

@elecs7g
Copy link

elecs7g commented May 24, 2017

How about this code.
def removeEmptyfolders(path):
for (_path, _dirs, _files) in os.walk(path, topdown=False):
if _files: continue # skip remove
try:
os.rmdir(_path)
print('Remove :', _path)
except OSError as ex:
print('Error :', ex)

@velcroMustacho
Copy link

Sorry, I'm a total newby to Python-
Do i just stick this script in the associated folder and run it from in there? Or do i specify the directory somewhere in the code?
Thanks!

@dstromberg
Copy link

@velcroMustacho:

For jacobtomlinson's, put the script in a different directory, and pass the root of the directory hierarchy you want to clean on the command line. It's shell-callable.

elecs7g's is Python-callable - put it inside your script (other than jacobtomlinson's :), and pass it the root of the directory hierarchy you want to clean as a python string (str).

@tanujkapoor15
Copy link

what is removeRoot used for?

@yonglam
Copy link

yonglam commented Nov 23, 2018

what is removeRoot used for?

It ought to been removed, I guess.

@roddds
Copy link

roddds commented Apr 28, 2019

This accomplishes basically the same thing with 6 lines: https://gist.github.com/roddds/aff960f47d4d1dffba2235cc34cb45fb

@DarthThomas
Copy link

This accomplishes basically the same thing with 6 lines: https://gist.github.com/roddds/aff960f47d4d1dffba2235cc34cb45fb

I think the one with 6 lines is not Recursively deleting the empty folders. if you have:

.
├── 43
│   └── 2019-06-17
│       ├── 0
│       └── 1
├── 44
│   └── 2019-06-17
│       ├── 0
│       ├── 1
│       ├── 2
│       └── 3
├── 45
│   └── 2019-06-17
│       ├── 0
│       ├── 1
│       └── 2
└── 46
    └── 2019-06-17
        └── 0

such that all folders with len(name) == 1 are empty. This code would delete them all but the 6-line version only deletes ones with len(name) == 1

@SzieberthAdam
Copy link

SzieberthAdam commented Jan 8, 2020

Pass a pathlib.Path instance to the function below:

def remove_empty_directories(pathlib_root_dir):
  # list all directories recursively and sort them by path,
  # longest first
  L = sorted(
      pathlib_root_dir.glob("**"),
      key=lambda p: len(str(p)),
      reverse=True,
  )
  for pdir in L:
    try:
      pdir.rmdir()  # remove directory if empty
    except OSError:
      continue  # catch and continue if non-empty

@clebiovieira
Copy link

Here, you found the folders... after that... use rmtree in a loop. :)

    empty_underlyings_path = [f.path
                              for f in os.scandir(self.__config.get_model_path())
                              if f.is_dir() and not os.listdir(f.path)]

@rnyren
Copy link

rnyren commented Apr 24, 2020

danke!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment