Из всей структуры каталогов я хотел бы вывести всех владельцев и сколько файлов принадлежит каждому владельцу.
Я хотел бы получить такой вывод:
+-------+-----+
| alex | 3 |
| liza | 345 |
| harry | 564 |
| sally | 23 |
+-------+-----+
Как я могу сделать это в bash
?
Это не проведет симпатичные линии, но...
#!/bin/bash
for _user in `ls /home`
do
_count=`ls -R /home/$_user/ | wc -l`
echo "$_user = $_count"
done
Рассмотрите возможность использования системы квот в Linux. Сначала вам нужно будет включить его и инициализировать, но для создания отчета потребуется гораздо меньше ресурсов.
quota
. usrquota
в файловую систему в /etc/fstab
. quotacheck -avug
. Запустите 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] Примечание: устанавливать фактические пределы квоты не нужно - просто используйте его для составления отчетов.
Я бы предложил использовать 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
На основе ответа 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/
каталог, и также это не будет работать правильно, если у одного пользователя будут файлы в каталоге другого пользователя.