du que conta o número de arquivos / diretórios em vez do tamanho


13

Estou tentando limpar um disco rígido que tenha todos os tipos de porcaria acumulados ao longo dos anos. duajudou a reduzir o uso do disco, mas a coisa toda ainda não é difícil devido ao tamanho total, mas ao grande número de arquivos e diretórios no total.

Existe uma maneira de fazer algo como, dumas sem contar o tamanho do arquivo, mas o número de arquivos e diretórios? Por exemplo: um arquivo é 1 e um diretório é o número recursivo de arquivos / diretórios dentro dele + 1.

Edit: Eu deveria ter sido mais claro. Eu gostaria de não só saber o número total de arquivos / diretórios em /, mas também em /home, /usretc, e em seus subdiretórios, de forma recursiva, como dufaz para o tamanho.


2
Pense que você pode estar à procura de algo como uma versão ligeiramente modificada das respostas aqui superuser.com/questions/198817/...
James

Respostas:


11

Eu achei du --inodesútil, mas não tenho certeza de qual versão durequer. No Ubuntu 17.10, o seguinte funciona:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

Combine com | sort -nrpara classificar decrescente pelo número de inodes contendo.


11
Parece muito mais com o que eu quero do que a resposta aceita.
Sridhar Sarnobat 16/03/19

8

A maneira mais fácil parece ser find /path/to/search -ls | wc -l

O Find é usado para percorrer todos os arquivos e pastas.
-lspara listar (imprimir) todos os nomes. Esse é um padrão e, se você deixar de fora, continuará funcionando da mesma forma em quase todos os sistemas. (Quase, já que alguns podem ter padrões diferentes). É um bom hábito usar explicitamente isso.

Se você apenas usar a find /path/to/search -lspeça, ela imprimirá todos os arquivos e diretórios na sua tela.


wcé contagem de palavras. a -lopção diz para contar o número de linhas.

Você pode usá-lo de várias maneiras, por exemplo

  • wc testfile
  • arquivo de teste para gatos | banheiro

A primeira opção permite que o wc abra um arquivo e conte o número de linhas, palavras e caracteres nesse arquivo. A segunda opção faz o mesmo, mas sem o nome do arquivo, ele lê do stdin.


Você pode combinar comandos com um pipe |. A saída do primeiro comando será canalizada para a entrada do segundo comando. Assim, find /path/to/search -ls | wc -lusa find para listar todos os arquivos e diretórios e alimenta a saída para wc. Wc então conta o número de linhas.

(Uma outra alternativa seria `ls | wc ', mas encontrar é muito mais flexível e uma boa ferramenta para aprender.)


[Editar após o comentário]

Pode ser útil combinar o find e o exec.

Por exemplo find / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;, listará todos os diretórios em /, exceto alguns que você não deseja pesquisar. Podemos acionar o comando anterior em cada um deles, produzindo uma soma de arquivos por pasta em /.

Contudo:

  1. Isso usa a extensão específica GNU -maxdepth.
    Ele funcionará no Linux, mas não em qualquer unix-a-similar.
  2. Eu suspeito que você realmente pode querer um número de arquivos para cada subdiretório.

Desculpe, não apenas um nível de profundidade, mas para todos os níveis (é o que eu quis dizer com "recursivamente" na minha edição).
Jesse

Em vez do eco executivo, você aciona uma localização | wc para cada dir. Eu sei que é possível, mas não consigo descobrir como hoje. Acho que continuo cometendo o mesmo erro de alguma forma. * Vai fazer café *.
Hennes

4

O seguinte script PHP faz o truque.

#!/usr/bin/php
<?php 

function do_scan($dir, $dev) {
  $total = 1;

  if (\filetype($dir) === 'dir' && \lstat($dir)['dev'] == $dev) {
    foreach (\scandir($dir) as $file) {
      if ($file !== '.' && $file !== '..') {
        $total += do_scan($dir . \DIRECTORY_SEPARATOR . $file, $dev);
      }
    }

    print "$total\t$dir\n";
  }

  return $total;
};

foreach (\array_slice($argv, 1) as $arg) {
  do_scan($arg, \lstat($arg)['dev']);
}

Coloque isso em um arquivo (digamos " treesize") chmod +xe execute-o com ./treesize . | sort -rn | less.


Por que essa é a resposta aceita ?! Você está assumindo que o php está na máquina, o que nem sempre é o caso. O script não está documentado e específico. Embora seja correto responder sua própria pergunta no SE, essa resposta nem fornece uma resposta para sua própria pergunta ; ou você não fez a pergunta que tinha em mente quando o problema ocorreu ... Infelizmente, não posso rebaixá-lo, tenho que dizer algumas coisas ... ainda assim, resposta ruim!
User1810087

Não consigo escrever o script em nenhum idioma sem assumir que um intérprete para esse idioma está instalado. O script imprime o número total de arquivos e diretórios abaixo de cada diretório recursivamente. Então, duisso simplesmente conta em vez de somar o tamanho, que é exatamente o que a pergunta original fez.
Jesse

2

ncdu é ótimo para isso!

Na página de manual, você também pode mostrar contagens por diretório e ordená-las por contagens:

[...]
KEYS
       C   Order by number of items (press again for descending order)
[...]
       c   Toggle display of child item counts.

Por exemplo:

saída ncdu


1

Explorar o fato de que diretórios e arquivos são separados por /. Esse script cumpre seus critérios, mas serve para inspirar uma solução completa. Você também deve indexar seus arquivos com a localização.

geee: /R/tb/tmp
$ find  2>/dev/null | awk -F/ -f filez  | sort -n
files:  57
3       imagemagick
7       portage
10      colemak-1.0
25      minpro.com
42      monolith
80      QuadTree
117     themh
139     skyrim.stings
185     security-howto
292     ~t
329     skyrim
545     HISTORY
705     minpro.com-original
1499    transmission-2.77
23539   ugent-settings

>

$ cat filez
{
a[$2]++;     # $1= folder,  $2 = everything inside folder.
}

END {
        for (i in a) {
                if (a[i]==1) {files++;}
                else { printf "%d\t%s\n", a[i], i; }
        }
        print "files:\t" files
}

>

 $ time locate /  | awk -F/ -f /R/tb/tmp/filez  | sort -n
 files:  13
 2
 2       .fluxbox
 10      M
 11      BIN
 120     bin
 216     sbin
 234     boot
 374     R
 854     dev
 1351    lib
 2018    etc
 9274    media
 30321   opt
 56516   home
 93625   var
 222821  usr
 351367  mnt
 time: Real 0m17.4s  User 0m4.1s  System 0m3.1s

2
Por que tenho o .fluxbox em /? : D
Ярослав Рахматуллин

1

Aqui está uma solução que usa o bash, inspirada em um post do Unix e Linux .

find . -type d | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

Se houver algumas pastas nas quais você não deseja ver os detalhes, como .git, você pode excluí-las da lista com grep.

find . -type d |grep -v "./.git/.*" | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.