我想从整个目录结构中输出所有所有者以及每个所有者拥有多少个文件。
我想要这样的输出:
+-------+-----+
| alex | 3 |
| liza | 345 |
| harry | 564 |
| sally | 23 |
+-------+-----+
我怎样才能做到这一点bash
?
答案1
这不会画出漂亮的线条,但是...
#!/bin/bash
for _user in `ls /home`
do
_count=`ls -R /home/$_user/ | wc -l`
echo "$_user = $_count"
done
答案2
我建议在 for 循环中find
使用:wc
users=`getent passwd | awk -F: '{print $1}'`
for user in $users
do
echo -n "file count for $user: "
find / -user $user -type f | wc -l
done
笔记:
find
默认是递归的。- 您可能希望在行前添加
find
以sudo
获得读取所有目录的权限。或者以 root 身份运行完整脚本。 - 现在仅限于文件通过
-type f
过滤器。如果您还想计算目录数量,请删除该过滤器。 - 它的效率不太高,因为它首先列出所有名称,然后
wc -l
只计算换行符的数量。
解析ls -R
不准确有几个原因。首先,它列出了两次目录条目。其次,它在进入目录时留下了一个额外的空白行。第三,您需要传递-a
计数隐藏文件。最后,无法过滤目录。
参见下面的演示:
mkdir d1 d2 d3
touch a b c d1/a d2/a d3/a
tree
.
├── a
├── b
├── c
├── d1
│ └── a
├── d2
│ └── a
└── d3
└── a
3 directories, 6 files
find . | wc -l
11
find . -type f | wc -l
7
ls -R | wc -l
16
ls -R | cat - # to show why the number was 16
.:
a
b
c
d1
d2
d3
./d1:
a
./d2:
a
./d3:
a
答案3
考虑使用 Linux 配额系统。您必须先启用它并初始化它,但它创建报告所需的资源要少得多。
- 安装该
quota
包。 - 在 中将挂载选项添加
usrquota
到文件系统/etc/fstab
。 - 重新挂载或者重新启动文件系统。
- 通过运行进行初始配额扫描
quotacheck -avug
。 运行
repquota
以列出使用情况。文件限制(已使用)列列出了每个用户的“文件”数量。但是,它与实际文件数量并不完全相同,但它是索引节点。Block limits File limits User used soft hard grace used soft hard grace ------------------------------------------------------ root -- 80088 0 0 12025 0 0 daemon -- 8 0 0 3 0 0 man -- 172 0 0 17 0 0
为了在稍后获得新报告,只需运行一次,而且这比重新repquota
运行要快得多!find
注意:不需要设置实际的配额限制 - 只需用于报告。
答案4
基于艾德·马奈的答案,这将打印文件计数周围的行:
#!/bin/bash
echo "+---------------+-------+"
for _user in `ls /home`
do
_count=`ls -R /home/$_user/ | wc -l`
printf "| $_user\t| $_count\t|\n"
done
echo "+---------------+-------+"
请注意,此功能通过计算每个用户主目录中的文件来实现,因此它只能扫描目录/home/
,而且如果一个用户在另一个用户的目录中有文件,它也无法正常工作。