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:
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/