我们如何计算目录中提到的一些文件的总大小。
解释:目录中总共有 5000 个文件。我只需要找出大约 1000 个文件的总大小。
实际上是要删除这 1000 个文件,但在删除之前需要计算这些文件的总大小。
我在文本文件中保存了这些文件的名称和路径。这些文件的形式为 pdf、flv、pptx 等,例如:
/digi_en-gb/var/www/html/content/Collaborative_Games/multiplication/SB/08_Multiplication Maze SB_Done.doc
/digi_en-gb/var/www/html/content/Project_Ideas/178401/178401_chart_food_secu.pdf
/digi_en-gb/var/www/html/content/LessonPlan_Master/100079/AC1030T.pptx
有人能帮我提供脚本或命令来实现这一点吗?
答案1
如果你有一个NUL 已终止文件列表,那么您可以使用选项--files0-from=
。du
来自man du
:
--files0-from=F
summarize disk usage of the NUL-terminated file names specified
in file F; If F is - then read names from standard input
tr
您可以使用例如将换行符分隔的列表转换为 NUL 分隔的列表
tr '\n' '\0' < filelist > filelist0
然后
du -sch --files0-from=filelist0
如果你想看仅有的总数,然后将结果通过管道传输tail
du -sch --files0-from=filelist0 | tail -n 1
为了避免生成额外的文件,你可以这样做
tr '\n' '\0' < filelist | du -sch --files0-from=- | tail -n 1
答案2
list
假设您已在文件中保存了类似以下格式的文件 PATH :
/path/to/filename0.pdf
/path/to/filename1.pdf
/path/to/filename0.flv
/path/to/filename0.pptx
...
并尝试以下命令,该du -h
命令从内部awk
为文件的每一行($0
)调用 shell 命令list
:
awk '/.*pdf|.*flv$/{ system("du -h \"" $0 "\"") }' /path/to/list
13.2M /path/to/filename0.pdf
5.3M /path/to/filename1.pdf
50.18M /path/to/filename0.flv
如您所见,这将显示每行每个 .pdf 和 .flv 文件的大小。
现在,如果您想计算所有文件大小的总和,请使用awk
以下命令:
awk '/.*pdf|.*flv$/{ system("du -h \"" $0 "\"") }' /path/to/list | awk '{ SUM += $1} END{ print "Total "SUM" MB" }'
Total 68.68 MB
此外,您还可以使用rm
与命令awk
相同的du
命令来提示匹配的文件包括其左侧的尺寸并点击Y/N
删除选定的文件。请参见以下步骤:
$ ls path/to/
filename0.flv filename0.pdf filename1.pdf filename.pptx list
$ awk '/.*pdf$|.*flv$/{ system("du -h \"" $0 "\"" ";rm -i \"" $0 "\"")}' path/to/list
13.2M /home/user/path/to/filename0.pdf
rm: remove regular file ‘/home/user/path/to/filename0.pdf’? y
5.3M /home/user/path/to/filename1.pdf
rm: remove regular file ‘/home/user/path/to/filename1.pdf’? y
50.18M /home/user/path/to/filename0.flv
rm: remove regular file ‘/home/user/path/to/filename0.flv’? y
$ ls path/to/
filename.pptx list
答案3
由于我现在不在家,所以我还无法彻底测试它,但是一个小测试让我相信下面的脚本应该可以工作。
这是这个。
如何使用
将下面的脚本复制到一个空文件中,并将其保存为
calculate_size.py
。打开终端窗口,输入以下命令:
python3 /path/to/calculate_size.py </path/to/your/textfile/with/a/filelist>
笔记如果您需要
sudo
文件存储目录的权限,请使用以下命令运行脚本sudo
:sudo python3 /path/to/calculate_size.py </path/to/your/textfile/with/a/filelist>
它显示如下输出:
您的列表每行应该有一个文件路径,没有空行(否则会引发错误)。
剧本
#!/usr/bin/env python3
import os
import subprocess
import sys
f_list = sys.argv[1]
get = lambda x: subprocess.check_output(["/bin/bash", "-c", x]).decode("utf-8")
with open(f_list) as src:
files = [f.strip() for f in src.readlines()]
total_size = []
for f in files:
size = get('du -hk "'+f+'"').split()[0]; total_size.append(int(size))
print(f.strip('"')+"\t", size+" k")
print("-"*30, "\nnumber of files: "+str(len(total_size)), "\ntotal size: "+str(sum(total_size))+" k")
try:
print("average size: "+str(int(sum(total_size)/len(total_size)))+" k\n\n")
except ZeroDivisionError:
pass
proceed = input("Should I delete the listed files? \n(press return to proceed, x + return to cancel): ")
if proceed == "":
for file in files:
os.remove(file)
答案4
由于您有一个要删除的特定文件列表,并且在解决方案建模方面没有任何限制,因此它非常简单(bash):
#!/bin/bash
if [ $# -ne 1 ];
then
echo "Usage $0 filename";
exit 1;
fi
totalsize=0;
while read filename
do
filesize=`du $filename -b | awk '{print $1}'`
totalsize=$(($totalsize + $filesize))
done < $1
echo "Total usage $totalsize bytes"
该filesize
变量用于du
获取文件的大小(以字节为单位)。输出结果如下:
15 file.txt
而我们只需要从15
该输出中进行解析,我使用 awk,它打印第一行(分隔符是空格)
此外,如果您也想删除该文件,只需rm $filename
在 while 循环中添加