Подсчет файлов на владельца рекурсивно

Из всей структуры каталогов я хотел бы вывести всех владельцев и сколько файлов принадлежит каждому владельцу.

Я хотел бы получить такой вывод:

+-------+-----+
| alex  |   3 |
| liza  | 345 |
| harry | 564 |
| sally |  23 |
+-------+-----+

Как я могу сделать это в bash?

0
задан 1 February 2013 в 23:49

4 ответа

Это не проведет симпатичные линии, но...

#!/bin/bash

for _user in `ls /home`
do
    _count=`ls -R /home/$_user/ | wc -l`
    echo "$_user = $_count"
done
0
ответ дан 1 February 2013 в 23:49

Рассмотрите возможность использования системы квот в Linux. Сначала вам нужно будет включить его и инициализировать, но для создания отчета потребуется гораздо меньше ресурсов.

  1. Установите пакет quota.
  2. Добавьте опцию монтирования usrquota в файловую систему в /etc/fstab.
  3. Переустановите или перезагрузите файловую систему.
  4. Выполните начальное сканирование квоты, запустив quotacheck -avug.
  5. Запустите repquota, чтобы увидеть список использования. В столбце Ограничения файлов (используется) указано количество «файлов» на пользователя. Однако, это не совсем то же самое, что количество реальных файлов, но это число inode .

                            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! 1119] Примечание: устанавливать фактические пределы квоты не нужно - просто используйте его для составления отчетов.

0
ответ дан 1 February 2013 в 23:49

Я бы предложил использовать find и wc в цикле for:

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 по умолчанию рекурсивны. 1112]
  • Возможно, вы захотите добавить строку 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
0
ответ дан 1 February 2013 в 23:49

На основе ответа Ed Manet это распечатает строки вокруг количеств файла:

#!/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/ каталог, и также это не будет работать правильно, если у одного пользователя будут файлы в каталоге другого пользователя.

0
ответ дан 1 February 2013 в 23:49

Другие вопросы по тегам:

Похожие вопросы: