You cannot do this without taking a list of directories and taking both elements that you are looking for, and each of them is generally for comparison. The file system is case sensitive and that's all it needs.
Here is the function (well, two) that I wrote to do this completely, recursively matching the file name: http://portableapps.hg.sourceforge.net/hgweb/portableapps/development-toolkit/file/775197d56e86/utils.py # l78 .
def path_insensitive(path): """ Get a case-insensitive path for use on a case sensitive system. >>> path_insensitive('/Home') '/home' >>> path_insensitive('/Home/chris') '/home/chris' >>> path_insensitive('/HoME/CHris/') '/home/chris/' >>> path_insensitive('/home/CHRIS') '/home/chris' >>> path_insensitive('/Home/CHRIS/.gtk-bookmarks') '/home/chris/.gtk-bookmarks' >>> path_insensitive('/home/chris/.GTK-bookmarks') '/home/chris/.gtk-bookmarks' >>> path_insensitive('/HOME/Chris/.GTK-bookmarks') '/home/chris/.gtk-bookmarks' >>> path_insensitive("/HOME/Chris/I HOPE this doesn't exist") "/HOME/Chris/I HOPE this doesn't exist" """ return _path_insensitive(path) or path def _path_insensitive(path): """ Recursive part of path_insensitive to do the work. """ if path == '' or os.path.exists(path): return path base = os.path.basename(path) # may be a directory or a file dirname = os.path.dirname(path) suffix = '' if not base: # dir ends with a slash? if len(dirname) < len(path): suffix = path[:len(path) - len(dirname)] base = os.path.basename(dirname) dirname = os.path.dirname(dirname) if not os.path.exists(dirname): dirname = _path_insensitive(dirname) if not dirname: return # at this point, the directory exists but not the file try: # we are expecting dirname to be a directory, but it could be a file files = os.listdir(dirname) except OSError: return baselow = base.lower() try: basefinal = next(fl for fl in files if fl.lower() == baselow) except StopIteration: return if basefinal: return os.path.join(dirname, basefinal) + suffix else: return
Chris morgan
source share