Comando 'ls' mostrando o tamanho do diretório em vez do tamanho do bloco

0

Existe algum parâmetro ls que eu possa usar para exibir o tamanho do arquivo para diretórios também .

Quando eu faço ls -s , ele me mostra block-size (4k sempre) em vez do tamanho do diretório.

Obrigado !!!

Editar - conquista parcial

Como dito pelo @Arronical, o comando du -sh * mostra os arquivos & amp; diretórios com seu tamanho. Um pequeno aprimoramento que estou procurando é mostrar o diretório em cores diferentes, como ls shows. Alguma ideia. Obrigado. : -)

    
por We are Borg 21.01.2016 / 17:20

3 respostas

4

Idéia básica

Pode-se emular o ls -l com o find. Por exemplo, como com o comando find , que executará du por cada diretório e arquivo encontrado:

find . -maxdepth 1  ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null 

Exemplo de saída (nota lateral, aqui estou usando -type d para mostrar listagem para diretórios apenas para fins de demonstração; este comando sem -type d listará todos os arquivos e diretórios):

DIR:/xieerqi
skolodya@ubuntu:$ find . -maxdepth 1 -type d ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null | head      
drwxrwxr-x xieerqi xieerqi 348K ./addRemoveDistribution
drwxr-xr-x xieerqi xieerqi 2.2G ./Downloads
drwxrwxr-x xieerqi xieerqi 4.0K ./.screenlayout
drwxr-xr-x xieerqi xieerqi 4.0K ./Public
drwxrwxr-x xieerqi xieerqi 28K  ./Youku Files
drwxrwxr-x xieerqi xieerqi 142M ./.minecraft
drwx------ xieerqi xieerqi 20K  ./.gnupg
drwxrwxr-x xieerqi xieerqi 2.5G ./.Genymobile
drwxrwxr-x xieerqi xieerqi 73M  ./genymotion
drwxrwxr-x xieerqi xieerqi 104K ./scripts

NOTA : find tem -ls bandeira, o que eu não usa aqui, pelo mesmo motivo que OP declarou - mostra 4096 bytes canônicos

Simplificação

Este comando pode ser transformado em um alias, algo como ls2 ou uma função, que também poderia ter o argumento $1 . Por exemplo, aqui está o que eu coloquei no meu .bashrc e como funciona:

function lscwd
{
 # Function to stat files and folders in current dir
 # Takes first argument as directory to stat
 # If no directory supplied, current dir assumed
 if [ -z "$1" ];then
   DIR="."
 else
   DIR="$1"
 fi

 find "$DIR"  -maxdepth 1 ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null 

}

Amostra é executada:

DIR:/xieerqi
skolodya@ubuntu:$ lsc
lscpu lscwd 
skolodya@ubuntu:$ lscwd | head                                                                                               
drwxrwxr-x xieerqi xieerqi 348K ./addRemoveDistribution
drwxr-xr-x xieerqi xieerqi 2.2G ./Downloads
drwxrwxr-x xieerqi xieerqi 4.0K ./.screenlayout
drwxr-xr-x xieerqi xieerqi 4.0K ./Public
drwxrwxr-x xieerqi xieerqi 28K  ./Youku Files
drwxrwxr-x xieerqi xieerqi 142M ./.minecraft
drwx------ xieerqi xieerqi 20K  ./.gnupg
drwxrwxr-x xieerqi xieerqi 2.5G ./.Genymobile
drwxrwxr-x xieerqi xieerqi 73M  ./genymotion
drwxrwxr-x xieerqi xieerqi 104K ./scripts

DIR:/xieerqi
skolodya@ubuntu:$ lscwd /etc | head                                                                                          
drwxr-xr-x root root 18M    /etc
drwxr-xr-x root root 68K    /etc/logrotate.d
drwxr-xr-x root root 36K    /etc/apm
drwxr-xr-x root root 96K    /etc/speech-dispatcher
drwxr-xr-x root root 28K    /etc/jwm
drwxr-xr-x root root 8.0K   /etc/hp
drwxr-xr-x root root 8.0K   /etc/gtk-2.0
drwxr-xr-x root root 20K    /etc/gtkmathview
drwxr-xr-x root root 68K    /etc/xml
drwxr-xr-x root root 8.0K   /etc/esound

Organização de saída

Não há como colorir a saída nativamente em find , que é projetado especificamente para analisar nomes de arquivos. A coloração ls vem de caracteres especiais incluídos na saída, o que realmente não queremos.

No entanto, pode-se ler as permissões. O principal - em -rwxr-xr-x significa que é um arquivo normal e que o d in drwxr-xr-x significa diretório.

find também tem o prático -type flag, que também podemos usar para filtrar a saída. Por exemplo, aqui está a versão editada de lscwd

function lscwd2
{
 # Function to stat files and folders in current dir
 # Takes first argument as directory to stat
 # If no directory supplied, current dir assumed
 if [ -z "$1" ];then
   DIR="."
 else
   DIR="$1"
 fi

 # print directories first
 printf "*** DIRECTORIES *** \n"
 find "$DIR"  -maxdepth 1 -type d ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null 
 # print non-directories second
 printf "*** FILES *** \n"

 find "$DIR"  -maxdepth 1 ! -type d ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null 
 }

E exemplo de saída:

DIR:/bin
skolodya@ubuntu:$ lscwd2
*** DIRECTORIES *** 
drwxrwxr-x xieerqi xieerqi 4.0K ./c
drwxrwxr-x xieerqi xieerqi 12K  ./python
drwxrwxr-x xieerqi xieerqi 12K  ./perl
drwxrwxr-x xieerqi xieerqi 4.0K ./ANOTHERDIR
drwxrwxr-x xieerqi xieerqi 4.0K ./random
drwxrwxr-x xieerqi xieerqi 108K ./sh
drwxrwxr-x xieerqi xieerqi 38M  ./cs2
drwxr-xr-x xieerqi xieerqi 414M ./arduino-1.6.7
drwxrwxr-x xieerqi xieerqi 24K  ./codereview
*** FILES *** 
-rwxrwxr-x xieerqi xieerqi 4.0K ./preventShutdown.sh
-rw-rw-r-- xieerqi xieerqi 4.0K ./Dimmer.desktop
-rwxrwxr-x xieerqi xieerqi 4.0K ./updateWarning.sh
-rw-rw-r-- xieerqi xieerqi 4.0K ./somefile.txt
-rw-r--r-- xieerqi xieerqi 4.0K ./.bashrc
-rwxr-xr-x xieerqi xieerqi 4.0K ./setup.sh
-rwxrwxr-x xieerqi xieerqi 4.0K ./whiledemo.csh
-rwxr-xr-x xieerqi xieerqi 4.0K ./fmtcode.awk
-rwxrwxr-x xieerqi xieerqi 4.0K ./batmon.sh
-rwxr-xr-x xieerqi xieerqi 4.0K ./Dimmer.sh
-rw-rw-r-- xieerqi xieerqi 4.0K ./somefile2.txt

A saída às vezes pode ser muito longa, então eu sugiro usar essa função em conjunto com o utilitário de paging less . Apenas canalize a saída assim lscwd2 | less

Sobre ls e stat

Por que as pessoas sempre sugerem du ? izx em sua breve e impressionante resposta explicou melhor do que eu poderia, mas em poucas palavras, no Unix e Linux tudo é um arquivo , e no diretório de realidade é um arquivo com uma lista de arquivos vinculados a ele. Assim, stat e ls dão tamanho desse arquivo especial , não a quantidade total de todos os arquivos vinculados ao diretório. Mas du é o que salva o dia. Observe o que a descrição em man du diz:

% bl0ck_qu0te% O utilitário

du salta para cada diretório e soma o tamanho de arquivo de cada arquivo. Diferente do que ls e stat fazem.

Assim, o propósito de cada utilitário é muito diferente. ls está fazendo exatamente o que é solicitado a fazer - listar os tamanhos dos arquivos e vir do mundo Windows. Entendemos o tamanho do diretório como sendo esse "saco" cujo tamanho depende da quantidade de maçãs nele, se eu puder usá-lo para comparação . O Unix é um pouco diferente, sim, mas é realista. Talvez não atenda tanto às necessidades do usuário, mas faz sentido no sentido físico real.

Em uma nota lateral, o tamanho do bloco é por padrão 4k, mas uma vez que o arquivo cresce acima de 4k, o sistema de arquivos precisará alocar mais espaço. Por exemplo, minha pasta pessoal tem 73 GB no tamanho total de todos os arquivos. E quanto ao tamanho do bloco do diretório?

DIR:/bin
skolodya@ubuntu:$ ls -ld $HOME
drwxr-xr-x 94 xieerqi xieerqi 16384 Jan 22 07:24 /home/xieerqi/
    
por Sergiy Kolodyazhnyy 21.01.2016 / 19:01
4

Não estou ciente de nenhum parâmetro para o comando ls que pode conseguir isso, mas é possível encontrar os tamanhos dos diretórios e arquivos no diretório de trabalho atual com o comando du .

Tente usar:

du -sh ./*

Deve ser possível criar uma função ou um script que forneça informações sobre se é um arquivo ou diretório cujas informações estão sendo exibidas.

Como muru apontou, a opção -d ou --max-depth , com um parâmetro de 1, seria útil para listar apenas diretórios. Ele também trabalha em torno do fato de que os diretórios ocultos não são listados pela globalização normal do shell (a parte ./* ).

    
por Arronical 21.01.2016 / 18:09
2

A análise da saída de ls sempre leva ao luto. Veja esta explicação . Use stat ( man stat ) em seu lugar.

de man stat :

NAME
       stat - display file or file system status

SYNOPSIS
       stat [OPTION]... FILE...

DESCRIPTION
       Display file or file system status.
...

       %b     number of blocks allocated (see %B)

       %B     the size in bytes of each block reported by %b
...
       %n     file name

E um exemplo no meu sistema YMMV:

$ stat --format="%n %b %B" .bashrc $HOME
.bashrc 32 512
/home/w3 192 512
    
por waltinator 21.01.2016 / 19:45