Contando arquivos por proprietário recursivamente

0

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 ?

    
por l--''''''---------'''''''''''' 01.02.2013 / 20:36

4 respostas

2

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
    
por Ed Manet 01.02.2013 / 20:44
1

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.

  1. Instale o pacote quota .
  2. Adicione a opção usrquota mount ao sistema de arquivos em /etc/fstab .
  3. Remontar ou reinicializar o sistema de arquivos.
  4. Execute a varredura de cota inicial executando quotacheck -avug .
  5. 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.

    
por gertvdijk 01.02.2013 / 21:34
1

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.
  • Você pode querer preceder a linha find com sudo para ter privilégios para ler todos os diretórios. Ou execute o script completo como root.
  • Agora, limita as listagens de arquivos pelo filtro -type f . Remova isso se quiser contar diretórios também.
  • Não é muito eficiente, pois é a primeira listagem de todos os nomes, enquanto 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
    
por gertvdijk 01.02.2013 / 21:09
0

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.

    
por iBelieve 01.02.2013 / 20:57