2

次の関数を使用して、システム内のすべてのファイル サイズをターゲット ディレクトリから取得しています。

def get_files(target):
    # Get file size and modified time for all files from the target directory and down.
    # Initialize files list
    filelist = []
    # Walk the directory structure
    for root, dirs, files in os.walk(target):
        # Do not walk into directories that are mount points
        dirs[:] = filter(lambda dir: not os.path.ismount(os.path.join(root, dir)), dirs)
        for name in files:
            # Construct absolute path for files
            filename = os.path.join(root, name)
            # Test the path to account for broken symlinks
            if os.path.exists(filename):
                # File size information in bytes
                size = float(os.path.getsize(filename))
                # Get the modified time of the file
                mtime = os.path.getmtime(filename)
                # Create a tuple of filename, size, and modified time
                construct = filename, size, str(datetime.datetime.fromtimestamp(mtime))
                # Add the tuple to the master filelist
                filelist.append(construct)
    return(filelist)

これを変更して、ディレクトリとディレクトリの合計サイズを含む 2 番目のリストを含めるにはどうすればよいですか? ディレクトリ情報とサイズを取得するために別の関数で 2 回目のウォークを実行するよりも効率的になるように、この操作を 1 つの関数に含めようとしています。

アイデアは、上位 20 の最大ファイルのソートされたリストと、上位 10 の最大ディレクトリの 2 番目のソートされたリストでレポートを返すことができるようにすることです。

皆さんの提案に感謝します。

4

2 に答える 2

1

リストではなく辞書にディレクトリを出力しますが、気に入るかどうかを確認してください。

def get_files(target):
    # Get file size and modified time for all files from the target directory and down.
    # Initialize files list
    filelist = []
    dirdict = {}
    # Walk the directory structure
    for root, dirs, files in os.walk(target):
        # Do not walk into directories that are mount points
        dirs[:] = filter(lambda dir: not os.path.ismount(os.path.join(root, dir)), dirs)
        for name in files:
            # Construct absolute path for files
            filename = os.path.join(root, name)
            # Test the path to account for broken symlinks
            if os.path.exists(filename):
                # File size information in bytes
                size = float(os.path.getsize(filename))
                # Get the modified time of the file
                mtime = os.path.getmtime(filename)
                # Create a tuple of filename, size, and modified time
                construct = filename, size, str(datetime.datetime.fromtimestamp(mtime))
                # Add the tuple to the master filelist
                filelist.append(construct)
                if root in dirdict.keys():
                    dirdict[root] += size
                else:
                    dirdict[root] = size
    return(filelist, dirdict)

タプルのリストとしてdirdictが必要な場合は、次のようにします。

dirdict.items()
于 2012-05-12T01:16:44.673 に答える
0

この種のことを行うスクリプトがいくつかあります。「bigfiles.py」をgithubhttp://github.com/sente/sys-utils/blob/master/bigfiles.pyにアップロードしました

累積ディレクトリサイズの合計は計算されませんが、それほど問題なく変更できます。

次のように、特定の深さでディレクトリの合計サイズを合計できる他のコードがあります。

In [7]: t = build_tree_from_directory('/scratch/stu/')

In [8]: pprint.pprint(walk_tree(t,depth=0))
{'name': 'ROOT', 'size': 6539880514}

In [9]: pprint.pprint(walk_tree(t,depth=0))
{'name': 'ROOT', 'size': 6539880514}

In [10]: pprint.pprint(walk_tree(t,depth=1))
{'children': [{'name': 'apache2-gzip', 'size': 112112512},
              {'name': 'gitnotes', 'size': 897104422},
              {'name': 'finder', 'size': 3810736368},
              {'name': 'apache2', 'size': 1719919406}],
 'name': 'ROOT'}

In [12]: pprint.pprint(walk_tree(t,depth=2))
{'children': [{'children': [{'name': 'vhost', 'size': 103489662}],
               'name': 'apache2-gzip'},
              {'children': [{'name': '2', 'size': 533145458},
                            {'name': 'notes.git', 'size': 363958964}],
               'name': 'gitnotes'},
              {'children': [{'name': 'gzipped', 'size': 3810736368},
                            {'name': 'output.txt', 'size': 0}],
               'name': 'finder'},
              {'children': [{'name': 'sente_combined.log', 'size': 0},
                            {'name': 'lisp_ssl.log', 'size': 0},
                            {'name': 'vhost', 'size': 1378778576},
                            {'name': 'other_vhosts_access.log', 'size': 0},
                            {'name': 'ssl_error.log', 'size': 0},
                            {'name': 'ssl_access.log', 'size': 0},
                            {'name': 'sente_test.log', 'size': 0}],
               'name': 'apache2'}],
 'name': 'ROOT'}

FSは1回だけクロールされますが、フルサイズを取得するには、ツリーが作成されたらウォークする必要があります。リーフノードから開始してルートに向かって進むと、すべてのディレクトリの合計サイズを最も効率的に計算できます。

于 2012-05-12T01:53:51.407 に答える