def FtpRmTree(ftp, path): """Recursively delete a directory tree on a remote server.""" wd = ftp.pwd() try: names = ftp.nlst(path) except ftplib.all_errors as e: # some FTP servers complain when you try and list non-existent paths _log.debug('FtpRmTree: Could not remove {0}: {1}'.format(path, e)) return for name in names: if os.path.split(name)[1] in ('.', '..'): continue _log.debug('FtpRmTree: Checking {0}'.format(name)) try: ftp.cwd(name) # if we can cwd to it, it's a folder ftp.cwd(wd) # don't try a nuke a folder we're in FtpRmTree(ftp, name) except ftplib.all_errors: ftp.delete(name) try: ftp.rmd(path) except ftplib.all_errors as e: _log.debug('FtpRmTree: Could not remove {0}: {1}'.format(path, e))