2

我有一个像这样的多用户安装的硬盘驱动器:

/HDD1/user1
/HDD1/user2
/HDD1/user3

我想查看每个用户的文件夹,找到与表达式匹配的所有文件(例如,"*.txt"),然后将所有这些文件使用的空间相加,并按每个用户群报告:

user1: x bytes
user2: y bytes
user3: z bytes

我找到了所有文件的目录:

find /HDD1/ -name "*.txt" | rev | cut -d"/" -f2- | rev | uniq > txtfiles.dat

我以为我会使用循环遍历每一行来txtfiles.dat计算每个文件夹中的磁盘使用情况,但这似乎很麻烦。有没有更简洁的方法来做到这一点?类似于du在每个用户的文件夹中查找但只计算与表达式匹配的文件的东西?

4

5 回答 5

3

du接受一个列表,如果给定-a选项,将调整单个文件的大小,并使用该选项生成总数-c

在 bash shell$(cmd)中是 running 的输出cmd

因此,将所有这些放在一起,以获取所有 .txt 文件的大小,可以运行:

du -ac $(find . -name '*.txt')

于 2015-06-15T05:23:49.700 回答
1
find /HDD1/ -name "*.txt" -print0 | du -ch --files0-from -

说明:该find命令负责过滤文件集,并指定-print0使输出以 NUL 终止。

find输出通过管道传输到du. 指定--files0-from -表示从 STDIN 以 NUL 终止的流中读取文件路径。最后,-ch指示du以人类可读的形式添加总计行。

如果您想要的只是总数,您可以将结果通过管道传输到tail -1

find /HDD1/ -name "*.txt" -print0 | du -ch --files0-from - | tail -1
于 2015-06-15T05:21:49.017 回答
1

您可以遍历每个用户并对大小求和,如下所示:

for username in `ls /HDD1/`; do
  find $username -iname *.txt -printf '%s\n' | awk '{s+=$1}END{print s}' -
done

外部循环是给用户的,然后 find 搜索文件并打印出它们的大小,最后 awk 总结所有大小并打印出结果。

于 2015-06-15T05:29:37.003 回答
1

find 命令(在大多数系统上)可以以字节为单位打印文件的大小。然后,您可以将其合计,例如使用 awk。

for userdir in /HDD1/*
do find "$userdir" -type f -name '*.txt' -printf '%s\n' |
   awk -v u=$(basename "$userdir") '
        {tot+=$1}
        END{print u ": " tot " bytes"}
   '
done

这提供了您要求的输出格式(user1:x 字节)。如果字节数有点大,除以 1000 或 1024 得到千字节或千字节等(在 awk 中打印 tot/1000 而不是 tot)。

于 2015-06-15T06:18:37.063 回答
0

我将您所有答案中的点点滴滴汇总到此:

for n in /HDD1/*
  do
  uname=$(echo $n | cut -d'/' -f4)
  space=$(find /HDD1/$uname -name "*.txt" -print0 | du -ch --files0- from - | tail -1)
  echo $uname: $space
done

这似乎工作正常。感谢您的输入。

于 2015-06-15T06:20:47.043 回答