To have this structure with approx. 13M files, I got short in inodes. After a quick research and calculations I realized that such nesting depth is redundant and easily can be reduced. So I need to turn all the existing files of form 2f/d4/e1/c6/7a/2d/28fced849ee1bb76e7391b93eb12.jpg to 2f/d4/e1c67a2d28fced849ee1bb76e7391b93eb12.jpg.
To do that, I wrote a script that renames the files and removes empty directories.
TARGET_DIR = '/full/path/to/dir/containing/dirs/to/reduce/' TARGET_DIR_LEN = len(TARGET_DIR) + 1 CURRENT_DEPTH = 6 DESIRED_DEPTH = 2 last_dir = '' for dirname, _, filenames in os.walk(TARGET_DIR): path = dirname[TARGET_DIR_LEN:].split('/') if filenames and len(path) >= CURRENT_DEPTH: cur_dir = '/'.join(path[:DESIRED_DEPTH - CURRENT_DEPTH]) if last_dir != cur_dir: last_dir = cur_dir for filename in filenames: fullpath = os.path.join('/'.join(path), filename) parts = fullpath.split('/') prefix = '' if len(parts[0]) > 2: # cache prefix = parts[0] parts = parts[1:] old = os.path.join(dirname, filename) new = os.path.join(TARGET_DIR, prefix, '/'.join(parts[:DESIRED_DEPTH]), ''.join(parts[DESIRED_DEPTH:])) pass os.rename(old, new) for i in range(CURRENT_DEPTH - DESIRED_DEPTH): d = os.path.join(TARGET_DIR, dirname[0:(DESIRED_DEPTH - CURRENT_DEPTH + 1) * i] if i else dirname) try: os.rmdir(d) except OSError: break
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.