我在复杂的文件夹层次结构中存放了无数小文件;这些文件占用了太多空间(即数 TB)。我想找出哪种文件类型(即 .pdf 等)占用了所有空间,以便我可以考虑删除该类型的所有文件。
有没有一个 bash 命令/脚本可以轻松帮我解决这个问题?python 脚本也可以使用,但我没有 GUI。
谢谢!Alex
答案1
快推:
列出目录中的所有文件:
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]
现在,你所要做的就是创建一个字典将扩展名映射到累积文件大小并打印出字典(可能在排序或某些操作之后)。
希望能帮助到你。
答案2
我花了大约 5 分钟才写完。我使用 os.stat 的 st_size 而不是 os.path.getsize。我认为这并不重要。我使用 os.walk 递归地“遍历”当前工作目录 '.' 中的所有目录。编写它并不是为了提高效率或性能,只是为了开始。最终结果是字典中充满了文件扩展名作为键,每个值都转换为一个字符串,表示每种文件类型的总大小的可读格式。我采用了别人编写的方法来进行人性化格式化。最后一部分是一些按大小对文件类型进行排序的花哨技巧。如果您按下 ctrl+c,它会终止“大小调整”并只打印它有时间收集的结果。非常有趣!感谢您的陪伴,祝您玩得开心。
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
答案3
shell/gawk 解决方案:
查找:打印所有文件的文件名和大小
gawk:使用类型作为键并将总大小作为值创建一个关联数组。在输入的末尾:打印所有类型的大小。
find DIR -name "*.*" -type f -printf "%f %s\n" | awk '{sub(/.*\./,"",$1);count[$1]+=$2} END{for (var in count) print var, count[var];}'