打印大小为 windows 的文件夹树

print the folder tree with sizes, windows

我正在寻找一种方法来打印(或写入文件)我的 windows PC 的文件夹树,包括每个文件夹的大小 - 但不是单个文件的大小。 输出应如下所示: - 我的 Documents/pictures/selfies/ - 100MB - 我的 Documents/movies/ - 1000MB - 我的 Music/Mozart/ - 300MB ..等等

备注: 1) 如果没有办法解决,可以列出单个文件,但我可以通过编程方式(即使用解析或正则表达式)稍后将它们从列表中删除..

2) 目的是创建一个像 http://bl.ocks.org/mbostock/raw/1283663/readme.json 这样的分层文件,所以 .json 最好,但不是必需的:我将解析文本并创建一个 .json 文件作为第二步。

3) 这就是我所拥有的,但我不知道如何将其转换为我的需要。

@echo off
setlocal disabledelayedexpansion

set "folder=%~1"
if not defined folder set "folder=%cd%"

for /d %%a in ("%folder%\*") do (
    set "size=0"
    for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%%~fa\*" 2^>nul ^| findstr /b /c:"  "') do if "%%~c"=="" set "size=%%~b"
    setlocal enabledelayedexpansion
    echo(%%~nxa # !size!
    endlocal
)

endlocal

4) 我只能在 python 和我的机器上的批处理脚本中工作:(

谢谢大家 AC

这是 Python(2.7 兼容语法)脚本:

import sys
from os import stat, getcwd
from os.path import isdir, isfile, join
from glob import glob
from pprint import pprint

NAME_KEY = "name"
SIZE_KEY = "size"
CHILDREN_KEY = "children"

def _iter_path_w_files(path):
    if isfile(path):
        return {NAME_KEY: path, SIZE_KEY: stat(path).st_size}
    elif isdir(path):
        ret = {NAME_KEY: path, CHILDREN_KEY: []}
        for child in glob(join(path, "*")):
            ret[CHILDREN_KEY].append(_iter_path_w_files(child))
        return ret
    else:  # For readability only
        return None

def _iter_path_wo_files(path):
    ret = {NAME_KEY: path, SIZE_KEY: 0}
    for child in glob(join(path, "*")):
        if isfile(child):
            ret[SIZE_KEY] += stat(child).st_size
        else:
            child_ret = _iter_path_wo_files(child)
            ret.setdefault(CHILDREN_KEY, []).append(child_ret)
            ret[SIZE_KEY] += child_ret[SIZE_KEY]
    return ret

def iter_path(path, show_files=True):
    if show_files:
        return _iter_path_w_files(path)
    else:
        if isfile(path):
            return stat(path).st_size
        elif isdir(path):
            return _iter_path_wo_files(path)
        else:  # For readability only
            return None


if __name__ == "__main__":
    if len(sys.argv) > 1:
        path = sys.argv[1]
    else:
        path = getcwd()

    files = False  # Toggle this var if you want the files reported or not

    d = iter_path(path, files)
    pprint(d)

对于像这样的目录树(文件旁边的数字,是它们的大小):

  • 目录0
    • file00 (6)
    • dir00
      • dir000
        • dir0000
          • file00000 (9)
      • file000 (7)
    • dir01
      • dir010
      • file010 (7)

输出将是:

files = False:

{'children': [
              {'children': [
                            {'children': [
                                          {'name': 'dir0\dir00\dir000\dir0000',
                                           'size': 9L
                                          }
                                         ],
                             'name': 'dir0\dir00\dir000',
                             'size': 9L
                            }
                           ],
               'name': 'dir0\dir00',
               'size': 16L
              },
              {'children': [
                            {'name': 'dir0\dir01\dir010',
                             'size': 0
                            }
                           ],
               'name': 'dir0\dir01',
               'size': 7L
              }
             ],
 'name': 'dir0',
 'size': 29L
}

files = True:

{'name': 'dir0',
 'children': [
              {'name': 'dir0\dir00',
               'children': [
                            {'name': 'dir0\dir00\dir000',
                             'children': [
                                          {'name': 'dir0\dir00\dir000\dir0000',
                                           'children': [
                                                        {'name': 'dir0\dir00\dir000\dir0000\file00000',
                                                         'size': 9L
                                                        }
                                                       ]
                                          }
                                         ]
                            },
                            {'name': 'dir0\dir00\file000',
                             'size': 7L
                            }
                           ]
              },
              {'name': 'dir0\dir01',
               'children': [
                            {'name': 'dir0\dir01\dir010',
                             'children': []
                            },
                            {'name': 'dir0\dir01\file010',
                             'size': 7L
                            }
                            ]
              },
              {'name': 'dir0\file00',
               'size': 6L
              }
             ]
}

这些是 python 字典(为了便于阅读,我对它们进行了格式化)与 json 完全兼容(您可以尝试:json.dumps(d)(其中 d 是字典)).