Qual é a maneira mais fácil de obter uma lista de diretórios com tamanho e tamanho de arquivo?

0

O que eu estou tentando fazer é fazer um loop de diretórios e informações de saída sobre seus diretórios filhos em um formato muito específico para que seja adequado para o usuário e também algo que possa ser usado posteriormente com ferramentas como awk , grep e sed .

Isso será executado dentro da função em um script bash e será impresso no terminal de usuários. Muito parecido com um ls , mas com colunas, ordens e campos específicos. Eu vou construir sobre isso para executar essa função basicamente, canalizando-a para algo como awk capturando apenas os diretórios com os quais me preocupo e executando outras tarefas como diff neles.

~/Parent/2017
Directory Name    Size       Last Modified     Number of Files                 
2017-08-25        1.9 GB     Aug 30   16:39    141
2017-08-26        152 MB     Aug 27   12:57    48
2017-08-29        5.9 GB     Aug 30   7:19     462
2017-08-30        102 MB     Sep 2    14:36    20
2017-08-31        2.0 GB     Sep 1    9:18     148
2017-09-01        1.2 GB     Sep 5    10:21    89

Quando meu diretório Parent é parecido com isso

> ls -l ~/Parent/
2015
2016
2017
Backups
Catalog-file.data
'Temporary Folder DE2B14BB-1052-4FF0-B4E7-B94C0E3CC6F8'
backup-logs
rsync.log

Até agora eu tenho algo parecido com isso

  IFS=$'\n';
  for d in 'find -maxdepth 1 -type d | grep -P "\d{4}" | grep -v -P "[a-z]+"'; do
    for sd in 'find ${d} -maxdepth 1 -type d'; do
      file_count='ls -lh ${sd} | wc -l'
    done
    ls -lh ${d} | awk -v fc="$file_count" '{printf "%-13s %-8s %-5s %-5s %-8s %-8s \n", $8, $4, $5, $6, $7, fc}'
  done

Eu sei que não está funcionando corretamente. Eu estou apenas colocando o código que tenho até agora e estou perplexo. Como posso salvar uma variável ( file_count ) para cada linha que awk produz? FYI: Provavelmente vou precisar disso para poder substituir também a coluna ls "Size" por uma variável du -sh directory_name .

Normalmente eu poderia continuar trabalhando nisso. Mas eu acho que é quando eu cheguei nesse ponto que eu acho que provavelmente estou fazendo isso da maneira mais difícil e há uma maneira mais fácil de fazer isso. O que é que vocês acham? Dois loops assim? Ou existe uma maneira mais simples.

    
por Byron Mansfield 02.10.2017 / 07:39

2 respostas

3

Com as ferramentas do GNU, você pode fazer:

find . \( -path './*/*' -o -type d \) -printf '%TF %TH:%TM/%s/%p
find . \( -path './*/*' -o -type d \) -printf '%TF %TH:%TM/%s/%p%pre%' |
  gawk -F/ -v 'RS=%pre%' '
    BEGIN{split("K/M/G/T/P/E/Z/Y", u)}
    function h(n, i) {
      while (n >= 1024) {n /= 1024; i++}
      return sprintf("%.4g%s", n, u[i])
    }
    {s[$4] += $2; n[$4]++}
    NF == 4 {t[$4] = $1}
    END{
      PROCINFO["sorted_in"] = "@ind_str_asc"
      for (d in t) printf "%-13s %-8s %s %s\n", d, h(s[d]), t[d], n[d]
    }'
' | gawk -F/ -v 'RS=%pre%' ' BEGIN{split("K/M/G/T/P/E/Z/Y", u)} function h(n, i) { while (n >= 1024) {n /= 1024; i++} return sprintf("%.4g%s", n, u[i]) } {s[$4] += $2; n[$4]++} NF == 4 {t[$4] = $1} END{ PROCINFO["sorted_in"] = "@ind_str_asc" for (d in t) printf "%-13s %-8s %s %s\n", d, h(s[d]), t[d], n[d] }'

Isso conta o número e o tamanho aparente cumulativo (não uso do disco) de todos os arquivos nos diretórios, de forma recursiva (adicione -maxdepth 2 a find se não quiser considerar arquivos em níveis mais profundos). Para o uso do disco, você precisaria contar as contagens de blocos e contar apenas links físicos uma vez, o que se tornaria mais complicado.

    
por 02.10.2017 / 10:33
0

Dirigindo-se a uma parte específica do seu script, você está familiarizado com a ação find do comando% GNU -printf ? Está lá para fazer exibição personalizada de informações de arquivo ao longo das linhas do que você está fazendo. Você pode ser capaz de simplificar o seu script se você pesquisar arquivos e exibir ao mesmo tempo.

Para ilustrar a flexibilidade deste comando:

find -name '*.sh' -printf 'Script %P last accessed on %D at %r. Owned by %u with permissions set to %M'

... resulta em algo como ...

Script foo.sh last accessed on 03/01/17 at 10:15 PM. Owned by joe.blow with permissions set to -rwx-r-x-r-x
Script bar.sh last accessed on 03/22/17 at 02:42 AM. Owned by joe.blow with permissions set to -rw--r---r--

Existem cerca de 30 diretivas diferentes para praticamente todos os atributos de arquivo que você pode imaginar, e a formatação de data é baseada em strftime , por isso é bastante poderosa / flexível. As bandeiras também têm os modificadores usuais, como justificação esquerda / direita, largura mínima do número, etc.

    
por 02.10.2017 / 08:33

Tags