Lista um diretório, incluindo subdiretórios, com contagem de arquivos e tamanho cumulativo

5

Existe uma maneira de listar o conteúdo de um diretório, incluindo subdiretórios com uma contagem de arquivos e tamanho cumulativo?

Eu gostaria de ver:

  • Número de diretórios
  • Número de subdiretórios
  • número de arquivos
  • tamanho cumulativo
por Udhayakumar 27.11.2013 / 17:14

1 resposta

6

Se eu entendi corretamente, isso vai te dar o que você quer:

find /path/to/target -type d | while IFS= read -r dir; do 
  echo -ne "$dir\tsize: $(du -sh "$dir" | cut -f 1)" 
  echo -ne "\tsubdirs: $(find "$dir" -mindepth 1 -type d | wc -l)"
  echo -e "\tfiles: $(find "$dir" -type f | wc -l )";
done  | tac

Se você executar isso em /boot , por exemplo, você terá uma saída assim:

/boot/burg/themes/sora_extended size: 8.0K  subdirs: 0  files: 1
/boot/burg/themes/radiance/images   size: 196K  subdirs: 0  files: 48
/boot/burg/themes/radiance  size: 772K  subdirs: 1  files: 53
/boot/burg/themes/winter    size: 808K  subdirs: 0  files: 35
/boot/burg/themes/icons size: 712K  subdirs: 0  files: 76
/boot/burg/themes   size: 8.9M  subdirs: 26 files: 440
/boot/burg/fonts    size: 7.1M  subdirs: 0  files: 74
/boot/burg  size: 20M   subdirs: 29 files: 733
/boot/grub/locale   size: 652K  subdirs: 0  files: 17
/boot/grub  size: 4.6M  subdirs: 1  files: 224
/boot/extlinux/themes/debian-wheezy/extlinux    size: 732K  subdirs: 0  files: 11
/boot/extlinux/themes/debian-wheezy size: 1.5M  subdirs: 1  files: 22
/boot/extlinux/themes   size: 1.5M  subdirs: 2  files: 22
/boot/extlinux  size: 1.6M  subdirs: 3  files: 28
/boot/  size: 122M  subdirs: 36 files: 1004

Para ter acesso fácil a este comando, você pode transformá-lo em uma função. Adicione estas linhas ao arquivo de inicialização do seu shell ( ~/.bashrc for bash):

dirsize(){
    find "$1" -type d | while IFS= read -r dir; do 
    echo -ne "$dir\tsize: $(du -sh "$dir"| cut -f 1)" 
    echo -ne "\tsubdirs: $(find "$dir" -mindepth 1 -type d | wc -l)"
    echo -e "\tfiles: $(find "$dir" -maxdepth 1 -type f | wc -l )";
    done  | tac
}

Agora você pode executá-lo como dirsize /path/ .

Explicação

A função acima tem 5 partes principais:

  1. find /path/to/target -type d | while IFS= read -r dir; do ... ; done : encontrará todos os diretórios em /path/to/target e processará cada um deles, definindo a variável dir como seu nome. O IFS= garante que isso não será interrompido em diretórios com espaços em seus nomes.

  2. echo -ne "$dir\tsize: $(du -sh "$dir" | cut -f 1)" : usa o comando du para obter o tamanho do diretório e cut para imprimir apenas o primeiro campo de du .

  3. echo -ne "\tsubdirs: $(find "$dir" -mindepth 1 -type d | wc -l)" : este comando find procura por subdiretórios de $dir . O type -d garante que só encontramos diretórios, nenhum arquivo e o -mindepth garante que não contemos o diretório atual, . .

  4. echo -e "\tfiles: $(find "$dir" -maxdepth 1 -type f | wc -l)"; : Este procura por arquivos ( -type f ) diretamente ( -maxdepth 1 ) sob $dir . Não contará arquivos que estão em subdiretórios de $d .

  5. | tac : Finalmente, a coisa toda é passada por tac que simplesmente reverte a ordem em que as linhas são impressas. Isso significa que o tamanho total do diretório de destino será mostrado como a última linha. Se não for o que você deseja, basta excluir | tac .

por 27.11.2013 / 18:11