shutil.rmtree() clarification
There is some misunderstanding here.
Imagine a tree like this:
- user
- tester
- noob
- developer
- guru
If you want to delete user
, just do shutil.rmtree('user')
. This will also delete user/tester
and user/tester/noob
as they are inside user
. However, it will also delete user/developer
and user/developer/guru
, as they are also inside user
.
If rmtree('user/tester/noob')
would delete user
and tester
, how do you mean user/developer
would exist if user
is gone?
Or do you mean something like http://docs.python.org/2/library/os.html#os.removedirs ?
It tries to remove the parent of each removed directory until it fails because the directory is not empty. So in my example tree, os.removedirs('user/tester/noob')
would remove first noob
, then it would try to remove tester
, which is ok because it's empty, but it would stop at user
and leave it alone, because it contains developer
, which we do not want to delete.
This will definitely only delete the last directory in the specified path. Just try it out:
mkdir -p foo/bar
python
import shutil
shutil.rmtree('foo/bar')
...will only remove 'bar'
.
**For Force deletion using rmtree command in Python:**
[user@severname DFI]$ python
Python 2.7.13 (default, Aug 4 2017, 17:56:03)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import shutil
>>> shutil.rmtree('user/tester/noob')
But what if the file is not existing, it will throw below error:
>>> shutil.rmtree('user/tester/noob')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/shutil.py", line 239, in rmtree
onerror(os.listdir, path, sys.exc_info())
File "/usr/local/lib/python2.7/shutil.py", line 237, in rmtree
names = os.listdir(path)
OSError: [Errno 2] No such file or directory: 'user/tester/noob'
>>>
**To fix this, use "ignore_errors=True" as below, this will delete the folder at the given if found or do nothing if not found**
>>> shutil.rmtree('user/tester/noob', ignore_errors=True)
>>>
Hope this helps people who are looking for force folder deletion using rmtree.
If noob is a directory, the shutil.rmtree()
function will delete noob
and all files and subdirectories below it. That is, noob
is the root of the tree to be removed.