目录中特定文件大小总和

目录中特定文件大小总和

我们如何计算目录中提到的一些文件的总大小。

解释:目录中总共有 5000 个文件。我只需要找出大约 1000 个文件的总大小。

实际上是要删除这 1000 个文件,但在删除之前需要计算这些文件的总大小。

我在文本文件中保存了这些文件的名称和路径。这些文件的形式为 pdf、flv、pptx 等,例如:

/digi_en-gb/var/www/html/content/Collaborative_Games/multiplication/SB/08_Multip‌​lication 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 循环中添加

相关内容