Você deveria usar isso, eu acho. Como acabei de descobrir, é um utilitário padrão especificado pelo POSIX.
du
As opções especificadas por POSIX incluem:
O utilitário du deve estar em conformidade com as Diretrizes de Sintaxe do Utilitário XBD.
As seguintes opções devem ser suportadas:
-
%código%
Além da saída padrão, relate o tamanho de cada arquivo não do tipo diretório na hierarquia de arquivos com raiz no arquivo especificado. Independentemente da presença da opção -a, os não-diretórios dados como operandos de arquivo devem sempre ser listados.
-
%código%
Se um link simbólico é especificado na linha de comando, du deve contar o tamanho do arquivo ou hierarquia de arquivos referenciados pelo link.
-
%código%
Escreva os tamanhos dos arquivos em unidades de 1024 bytes, em vez das unidades padrão de 512 bytes.
-
%código%
Se um link simbólico for especificado na linha de comando ou encontrado durante a travessia de uma hierarquia de arquivos, du deverá contar o tamanho do arquivo ou da hierarquia de arquivos referenciados pelo link.
-
%código%
Em vez da saída padrão, relate apenas a soma total de cada um dos arquivos especificados.
-
%código%
Ao avaliar os tamanhos de arquivo, avalie apenas os arquivos que possuem o mesmo dispositivo que o arquivo especificado pelo operando de arquivo.
A especificação de mais de uma das opções mutuamente exclusivas -H e -L não será considerada um erro. A última opção especificada deve determinar o comportamento da utilidade.
O problema é que ele não informa sobre tamanho de arquivo, ele reporta sobre uso de disco . Eles são conceitos diferentes e as diferenças dependem do sistema de arquivos. Se você quiser obter o tamanho dos arquivos para um conjunto de arquivos, use algo como o seguinte:
{ echo
/usr/bin/ls -ndL .//*
} | sed '/\n/P;//D;N
\|//|s|\n|/&/|
$s|$|/|;s| .//|/\
/|;2!P;D'
É um bit relativamente simples de -a
que mantém uma janela endereçável de duas linhas na saída de -H
. Ele funciona deslizando por sua entrada - sempre -k
rinting, em seguida, -L
, eletcando a mais antiga das duas linhas em seu espaço de padrão, em seguida, puxando a linha de entrada -s
ext para substituí-la. É uma olhada de uma linha, basicamente.
Tem algumas deficiências importantes como escritas. Por exemplo, para minha conveniência, evitei manipular -x
sed
e usar a opção ls
, o que torna P
reportar no destino do link em vez do próprio link. Ele também assume apenas globs de diretório atuais. Depende do D
não ocorrendo nos nomes dos arquivos - porque é o separador. Isso é bastante comum para esse tipo de coisa - você N
no diretório e ls
de volta.
Tudo isso pode ser tratado em algumas linhas ou mais, mas é apenas uma demonstração.
O componente chave aqui - e o motivo da antecipação - é este pouco:
\|//|s|\n|/&/|
Quando a linha mais nova no espaço padrão contiver a string -> linkpath
, acrescente um -L
ao final da linha mais antiga e injete um ls
na cabeça do mais recente. Eu também substituo o /
por outro cd
ewline e mais duas barras delimitadoras de linha.
E assim:
drwxr-xr-x 1 1000 1000 6 Aug 4 14:40 .//dir*
drwxr-xr-x 1 1000 1000 0 Aug 4 14:40 .//dir1
drwxr-xr-x 1 1000 1000 6 Aug 8 17:34 .//dir2
drwxr-xr-x 1 1000 1000 22 Aug 10 18:12 .//dir3
drwxr-xr-x 1 1000 1000 16 Jul 11 21:59 .//new
-rw-r--r-- 1 1000 1000 8 Aug 20 11:32 .//newfile
-rw-r--r-- 1 1000 1000 0 Jul 6 11:24 .//new
file
-rw-r--r-- 1 1000 1000 0 Jul 6 11:24 .//new
file
link
Torna-se assim:
/drwxr-xr-x 1 1000 1000 6 Aug 4 14:40/
/dir*/
/drwxr-xr-x 1 1000 1000 0 Aug 4 14:40/
/dir1/
/drwxr-xr-x 1 1000 1000 6 Aug 8 17:34/
/dir2/
/drwxr-xr-x 1 1000 1000 22 Aug 10 18:12/
/dir3/
/drwxr-xr-x 1 1000 1000 16 Jul 11 21:59/
/new/
/-rw-r--r-- 1 1000 1000 8 Aug 20 11:32/
/newfile/
/-rw-r--r-- 1 1000 1000 0 Jul 6 11:24/
/new
file/
/-rw-r--r-- 1 1000 1000 0 Jul 6 11:24/
/new
file
link/
Mas que uso é esse, certo? Bem, isso faz toda a diferença:
IFS=/; set -f; set $(set +f
{ echo
/usr/bin/ls -ndL .//*
}| sed '/\n/P;//D;N
\|//|s|\n|/&/|
$s|$|/|;s| .//|/\
/|;2!P;D'
)
unset IFS
while [ -n "$2" ]
do printf 'Type :\t <%.1s>\tSize :\t %.0s%.0s%.0s<%d>%.0s%.0s%.0s\nFile :\t %s\n' \
$2 "<$4>"
shift 4; done
OUTPUT
Type : <d> Size : <6>
File : <dir*>
Type : <d> Size : <0>
File : <dir1>
Type : <d> Size : <6>
File : <dir2>
Type : <d> Size : <22>
File : <dir3>
Type : <d> Size : <16>
File : <new>
Type : <-> Size : <8>
File : <newfile>
Type : <-> Size : <0>
File : <new
file>
Type : <-> Size : <0>
File : <new
file
link>