我有一个安装了多个用户的硬盘驱动器:
/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
这样的东西可以查看每个用户的文件夹但只计算与表达式匹配的文件?
答案 0 :(得分:2)
du
会获取一个列表,如果给出-a
选项,则会调整单个文件的大小,并使用-c
选项生成总计。
在bash shell中$(cmd)
是运行cmd
的输出。
所以,把所有这些放在一起,以获得所有.txt文件的大小,可以运行:
du -ac $(find . -name '*.txt')
答案 1 :(得分: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
答案 2 :(得分:1)
您可以遍历每个用户并总结大小如下:
for username in `ls /HDD1/`; do
find $username -iname *.txt -printf '%s\n' | awk '{s+=$1}END{print s}' -
done
外部循环用于用户,然后find执行搜索文件并打印出它们的大小,最后awk总结所有大小并打印出结果。
答案 3 :(得分: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 bytes)。 如果字节数有点大,除以1000或1024得到千或 kibi字节等(在awk打印tot / 1000而不是tot)。
答案 4 :(得分: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
这似乎工作得很好。感谢您的所有意见。