我在复杂的文件夹层次结构中有很多小文件; 这些占用太多空间(即太字节)。我想找出哪个文件类型(即.pdf等)占用了所有空间,以便我可以考虑删除该类型的所有文件。
是否有一个bash命令/脚本可以轻松解决这个问题?python脚本也可行,但我没有gui。
谢谢!亚历克斯
这似乎是相关的:https://stackoverflow.com/questions/1358920/bash-measure-disk-space-of-certain-file-types-in-aggregate
我在复杂的文件夹层次结构中有很多小文件; 这些占用太多空间(即太字节)。我想找出哪个文件类型(即.pdf等)占用了所有空间,以便我可以考虑删除该类型的所有文件。
是否有一个bash命令/脚本可以轻松解决这个问题?python脚本也可行,但我没有gui。
谢谢!亚历克斯
这似乎是相关的:https://stackoverflow.com/questions/1358920/bash-measure-disk-space-of-certain-file-types-in-aggregate
Answers:
Quicktut:
列出目录中的所有文件:
import os
path="C:\\somedirectory" # insert the path to the directory of interest
dirList=os.listdir(path)
for fname in dirList:
print fname
你必须使上面的递归,以使它也适用于子文件夹。
获取文件的文件大小:
import os
b= os.path.getsize("/path/isa_005.mp3")
获取文件扩展名:
import os
ext = os.path.splitext(file_name)[1]
现在,您所要做的就是创建一个字典映射扩展到累积文件大小并打印出字典(可能在排序之后)。
希望能帮助到你。
我刚刚在大约5分钟内写完了这篇文章。而不是os.path.getsize我使用os.stat的st_size。我认为这不重要。我使用os.walk以递归的方式“遍历”当前工作总监的所有目录。这不是为了效率或性能而写的,只是为了让事情顺利进行。最终结果是填充了键的文件扩展名的字典,并且每个值被转换为表示每种文件类型的总大小的人类可读格式的字符串。我采用了别人写的方法来进行人工格式化。最后一部分是通过大小对文件类型进行排序的一些花哨的smancy。如果你点击ctrl + c它会杀死“sizing-up”并打印出它有时间收集的结果。很有趣!谢谢你的骑行,享受。
import os
#using code ripped from:
#http://www.5dollarwhitebox.org/drupal/node/84
#to convert to human readable format
def convert_bytes(bytes):
bytes = float(bytes)
if bytes >= 1099511627776:
terabytes = bytes / 1099511627776
size = '%.2fT' % terabytes
elif bytes >= 1073741824:
gigabytes = bytes / 1073741824
size = '%.2fG' % gigabytes
elif bytes >= 1048576:
megabytes = bytes / 1048576
size = '%.2fM' % megabytes
elif bytes >= 1024:
kilobytes = bytes / 1024
size = '%.2fK' % kilobytes
else:
size = '%.2fb' % bytes
return size
typesizeH = {}
typesize = {}
try:
for root, dirs, files in os.walk('.'):
for file in files:
prefix, extension = os.path.splitext(file)
if extension not in typesize:
typesize[extension] = 0
typesize[extension] += os.stat(root + os.sep + file).st_size
except KeyboardInterrupt:
pass
for key in typesize:
typesizeH[key] = convert_bytes(typesize[key])
print str(typesizeH)
types = typesize.keys()
types.sort(cmp=lambda a,b: cmp(typesize[a], typesize[b]), reverse=True)
print "Filetype\tSize"
for type in types:
print "%s\t%s" % (type, typesizeH[type])
结果:
Filetype Size
.7z 99.84M
.hpp 42.88M
.lib 39.40M
.ncb 28.50M
.dll 27.87M
.exe 25.26M
.h 10.33M
.obj 10.18M
.zip 6.83M
.svn-base 3.92M
3.52M
.txt 2.28M
.csv 1.09M
shell / gawk解决方案:
find:打印所有文件的文件名和大小
gawk:使用type作为键创建一个Assoc Array,并将大小总计为值。在输入结束时:所有类型的打印尺寸。
find DIR -name "*.*" -type f -printf "%f %s\n" | awk '{sub(/.*\./,"",$1);count[$1]+=$2} END{for (var in count) print var, count[var];}'