打印大小为 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
是字典)).
我正在寻找一种方法来打印(或写入文件)我的 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)
- dir0000
- file000 (7)
- dir000
- 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
是字典)).