Isso não vai desenhar as linhas bonitas, mas ...
#!/bin/bash
for _user in 'ls /home'
do
_count='ls -R /home/$_user/ | wc -l'
echo "$_user = $_count"
done
De uma estrutura de diretórios inteira, gostaria de exibir todos os proprietários e quantos arquivos pertencem a cada proprietário.
Eu gostaria de uma saída como esta:
+-------+-----+
| alex | 3 |
| liza | 345 |
| harry | 564 |
| sally | 23 |
+-------+-----+
Como posso fazer isso em bash
?
Isso não vai desenhar as linhas bonitas, mas ...
#!/bin/bash
for _user in 'ls /home'
do
_count='ls -R /home/$_user/ | wc -l'
echo "$_user = $_count"
done
Considere o uso do sistema de cotas do Linux. Você terá que ativá-lo primeiro e inicializá-lo, mas isso exigirá muito menos recursos para criar um relatório.
quota
. usrquota
mount ao sistema de arquivos em /etc/fstab
. quotacheck -avug
. Execute repquota
para listar o uso. A coluna Limites do arquivo (usado) lista a quantidade de 'arquivos' por usuário. No entanto, não é exatamente o mesmo que a quantidade de arquivos reais, mas é o número de inodes .
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
Para obter um novo relatório mais tarde, é necessário executar apenas repquota
e isso será executado muito mais rapidamente do que executar find
novamente!
Observação: não é necessário definir limites reais de cota. Basta usá-lo para gerar relatórios.
Sugiro usar find
e wc
em um loop:
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
Notas:
find
é recursivo por padrão. find
com sudo
para ter privilégios para ler todos os diretórios. Ou execute o script completo como root. -type f
. Remova isso se quiser contar diretórios também. wc -l
apenas conta o número de novas linhas. A análise de ls -R
é imprecisa por diversos motivos. Em primeiro lugar, lista as entradas do diretório duas vezes. Em segundo lugar, deixa uma linha em branco adicional enquanto desce aos diretórios. Em terceiro lugar, você precisará passar -a
para contar arquivos ocultos. E, finalmente, não será possível filtrar diretórios.
Veja a demonstração abaixo:
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
Com base na resposta de Ed Manet , isto irá imprimir as linhas em torno das contagens de arquivos:
#!/bin/bash
echo "+---------------+-------+"
for _user in 'ls /home'
do
_count='ls -R /home/$_user/ | wc -l'
printf "| $_user\t| $_count\t|\n"
done
echo "+---------------+-------+"
Observe que isso funciona contando os arquivos no diretório pessoal de cada usuário, para que ele possa verificar apenas o diretório /home/
e também não funcionará corretamente se um usuário tiver arquivos no diretório de outro usuário.