Tamanhos de conteúdo de diretório integrados em 'ls'?

3

ls lista o conteúdo do diretório. du lista o tamanho do conteúdo do diretório. Existe alguma maneira de obter uma listagem de ls , mas com diretórios mostrando o tamanho do conteúdo?

    
por Ouroborus 24.06.2016 / 21:43

4 respostas

2

Coloque esta declaração da função shell nos seus scripts de inicialização do shell:

function duls {
    paste <( du -hs -- "$@" | cut -f1 ) <( ls -ld -- "$@" )
}

Chamei-o de duls porque mostra a saída de du e ls (nessa ordem):

$ duls
210M    drwxr-xr-x  21 kk  staff  714 Jun 15 09:32 .

$ duls *
 36K    -rw-r--r--   1 kk  staff    35147 Jun  9 16:03 COPYING
8.0K    -rw-r--r--   1 kk  staff     6962 Jun  9 16:03 INSTALL
 28K    -rw-r--r--   1 kk  staff    24816 Jun 10 13:26 Makefile
4.0K    -rw-r--r--   1 kk  staff       75 Jun  9 16:03 Makefile.am
 24K    -rw-r--r--   1 kk  staff    24473 Jun 10 13:26 Makefile.in
4.0K    -rw-r--r--   1 kk  staff     1689 Jun  9 16:03 README
120K    -rw-r--r--   1 kk  staff   121585 Jun 10 13:26 aclocal.m4
684K    drwxr-xr-x   7 kk  staff      238 Jun 10 13:26 autom4te.cache
128K    drwxr-xr-x   8 kk  staff      272 Jun  9 16:03 build
 60K    -rw-r--r--   1 kk  staff    60083 Jun 10 13:26 config.log
 36K    -rwxr-xr-x   1 kk  staff    34716 Jun 10 13:26 config.status
264K    -rwxr-xr-x   1 kk  staff   266637 Jun 10 13:26 configure
8.0K    -rw-r--r--   1 kk  staff     4280 Jun 10 13:25 configure.ac
7.0M    drwxr-xr-x   8 kk  staff      272 Jun 10 13:26 doc
2.3M    drwxr-xr-x  28 kk  staff      952 Jun 10 13:26 examples
6.2M    -rw-r--r--   1 kk  staff  6505797 Jun 15 09:32 mrbayes-3.2.7-dev.tar.gz
 11M    drwxr-xr-x  42 kk  staff     1428 Jun 10 13:26 src

$ duls doc
7.0M    drwxr-xr-x  8 kk  staff  272 Jun 10 13:26 doc

$ duls [bM]*
 28K    -rw-r--r--  1 kk  staff  24816 Jun 10 13:26 Makefile
4.0K    -rw-r--r--  1 kk  staff     75 Jun  9 16:03 Makefile.am
 24K    -rw-r--r--  1 kk  staff  24473 Jun 10 13:26 Makefile.in
128K    drwxr-xr-x  8 kk  staff    272 Jun  9 16:03 build

Explicação:

O utilitário paste cria colunas a partir de sua entrada de acordo com a especificação que você fornece. Dados dois arquivos de entrada, eles são colocados lado a lado, com uma tabulação como separador.

Nós damos a saída de du -hs -- "$@" | cut -f1 como o primeiro arquivo (fluxo de entrada realmente) e a saída de ls -ld -- "$@" como o segundo arquivo.

Na função, "$@" será avaliado na lista de todos os argumentos da linha de comando, cada um com aspas duplas. Portanto, ele irá entender os caracteres globbing e os nomes dos caminhos com espaços, etc.

Os duplos minuses ( -- ) sinalizam o fim das opções da linha de comando para du e ls . Sem isso, dizer duls -l confundiria du e qualquer opção para du que ls não confunderia ls (e as opções que existem em ambas as utilidades podem não significar a mesma coisa, e seria uma bagunça).

O cut após du simplesmente corta a primeira coluna da saída du -hs (os tamanhos).

Eu decidi colocar a saída du à esquerda, caso contrário eu teria que gerenciar uma coluna bamba da direita (devido a diferentes comprimentos de nomes de arquivos).

O comando não aceitará sinalizadores de linha de comando.

Isso foi testado em bash e em ksh93 . Não funcionará com /bin/sh .

    
por 25.06.2016 / 22:04
1

ls -l mostrará os tamanhos dos arquivos dentro de um diretório. du -sh * mostrará o tamanho dos diretórios.

    
por 24.06.2016 / 21:53
1

Eu consegui fazer o que você quer com algumas chamadas sed complexas: -

ls -d Directory/*|while l="$(line)";\
   do s=$(du -sb "$l"|sed "s/^\([0-9]*\).*$//"); ls -ld "$l"|\
      sed "s/^\(d[^ ]*  *[^ ]*  *[^ ]*  *[^ ]* \) *[^ ]* /\[$s\] /g";\
   done

Nota: -

  1. Coloquei colchetes em volta dos tamanhos de diretório para distingui-los dos tamanhos dos arquivos.
  2. A tabulação nas entradas de diretório será compensada, devido aos comprimentos de string diferentes dos tamanhos relatados por du , mas os comandos poderiam ser refinados ainda mais para considerar isso.
  3. Seria significativamente mais simples se não houvesse espaços em branco ou outros caracteres não imprimíveis nos nomes dos arquivos.
  4. O comando funciona substituindo o tamanho do diretório retornado por ls -l pelo tamanho retornado por du -s ; por causa da complexidade da substituição du é chamado antes de trabalhar se for necessário fazê-lo, a fim de simplificar o script.
  5. Seria melhor usar algo como [ "$l" == "${l#d}" ] && echo "$l" || { s=$(du ...); sed ...; } para procurar um diretório e só então chamar du e fazer a substituição.
  6. Se você não tem um comando line , pode usar while read -r l; do ... , mas isso perde os espaços em branco iniciais e finais, então eu uso line naturalmente.

Eu escrevi um script line que usa read enquanto preserva todos os espaços em branco:

read -r; r=$?; echo "$REPLY"; return $r 2>/dev/null; exit $r

(A sequência de retorno / saída complicada impede que o shell seja encerrado se chamado usando . / source .)

    
por 25.06.2016 / 20:16
-1

Se você ler o cara do ls command , verá há uma opção -h , que mostra em um tipo legível por humanos o tamanho de cada arquivo dentro de um diretório.

    
por 24.06.2016 / 21:50

Tags