Rename/Backup old directory in python
Question: I have a script that creates a new directory regularly. I would like to check
if it already exists and if so move the existing folder to a backup. My first
iteration was

    
    
    if os.path.isdir(destination_path):
       os.rename(destination_path,destination_path + '_old')
    

However, if there already one being backed up it will obviously crash. What I
would like to do is find the number of directories that match the
destination_path and append that number like a version number.

    
    
    if os.path.isdir(destination_path):
       n = get_num_folders_like(destination_path)
       os.rename(destination_path,destination_path + str(n))
    

I am just not sure how to make such a hypothetical function. I think fnmatch
might work but I can't get the syntax right.


Answer: If you need to move the old directory aside, renumbering can easily be done by
listing all directories by the same name, then picking last one by extracting
the numeric maximum from the matching names.

Listing the directories can be done by using the [`glob`
module](https://docs.python.org/2/library/glob.html#glob.glob); it combines
listing files with the `fnmatch` module to filter:

    
    
     import glob
    
    if os.path.isdir(destination_path):
         # match all paths starting with the destination name, plus at least
         # an underscore and one digit.
         backups = glob.glob(destination_path + '_[0_9]*')
         def extract_number(path):
             try:
                 # assume everything after `_` is a number
                 return int(path.rpartition('_')[-1])
             except ValueError:
                 # not everything was a number, skip this directory
                 return None
    
         backup_numbers = (extract__number(b) for b in backups)
         try:
             next_backup = max(filter(None, backup_numbers)) + 1
         except ValueError:
             # no backup directories
             next_backup = 1
    
    os.rename(destination_path,destination_path + '_{:d}'.format(next_backup))
    

I'm assuming you are not worried about race conditions here.

