Wenn die Inodes mal wieder volllaufen sollten, bin ich vorbereitet. >:]
#!/usr/bin/env python2
# -*- coding:utf8 -*-
__author__ = 'baccenfutter'
__licence__ = 'Academic Free 3.0'
__date__ = '2013-06-27'
import os
import sys
class Basedir(object):
def __init__(self, base="/tmp"):
"""Representation of a base directory
:param base: str -- absolute path of base directory
"""
self.base = base
self.hiddenfiles = True
self.__data = {}
def __repr__(self):
"""repr(self) -> <Basedir|base=%s|layers=%i>"""
return '<Basedir|%s>' % self.base
def __get_dirs(self, base):
"""Helper for obtaining a subdirectory list
:param base: str -- absolute path of directory to traverse
:returns: Generator
"""
for d in os.walk(base).next()[1]:
if self.hiddenfiles and d.startswith('.'):
continue
else:
yield d
def __get_files(self, base):
"""Helper for obtaining a file list
:param base: str -- absolute path of directory to traverse
:return: Generator
"""
for f in os.walk(base).next()[2]:
if self.hiddenfiles and f.startswith('.'):
continue
else:
yield f
def __traverse(self, base, max_recursion, current=0):
"""
:param base: str -- absolute path of base directory
:param max_recursion: int -- max recursion level
:param current: int -- current recursion level
"""
if current < max_recursion:
for d in self.__get_dirs(base):
self.__traverse(os.path.join(base, d), max_recursion, current + 1)
elif current >= max_recursion:
self.__data[base] = len(list(self.__get_files(base))) - 1
for root, dirs, files in os.walk(base):
self.__data[base] += 1
def traverse(self, depth=0):
"""Traverse this basedir
:param depth: int -- maximum number of recursion, e.g. level of depth
:return: list
"""
if not self.__data:
self.__traverse(self.base, max_recursion=depth)
return sorted(self.__data.items(), key=lambda x: x[1])
if __name__ == '__main__':
try:
basename = sys.argv[1]
except:
basename = '/tmp/test'
try:
depth = int(sys.argv[2])
except:
depth = 1
basedir = Basedir(basename)
for d, i in basedir.traverse(depth):
print '%8i %s' % (i, d)