以递归方式计算每个所有者的文件数量

以递归方式计算每个所有者的文件数量

我想从整个目录结构中输出所有所有者以及每个所有者拥有多少个文件。

我想要这样的输出:

+-------+-----+
| 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默认是递归的。
  • 您可能希望在行前添加findsudo获得读取所有目录的权限。或者以 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 配额系统。您必须先启用它并初始化它,但它创建报告所需的资源要少得多。

  1. 安装该quota包。
  2. 在 中将挂载选项添加usrquota到文件系统/etc/fstab
  3. 重新挂载或者重新启动文件系统。
  4. 通过运行进行初始配额扫描quotacheck -avug
  5. 运行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/,而且如果一个用户在另一个用户的目录中有文件,它也无法正常工作。

相关内容