Como obtenho o tamanho real do diretório, usando as ferramentas padrão UNIX / Linux?
Pergunta alternativa: Como obtenho du para me mostrar o tamanho real do diretório (não o uso do disco)?
Como as pessoas parecem ter definições diferentes do termo "tamanho": Minha definição de "tamanho do diretório" é a soma de todos os arquivos regulares nesse diretório.
NÃO me importo com o tamanho do inode do diretório ou com o que (arquivos * tamanho do bloco) os arquivos ocupam no respectivo sistema de arquivos. Um diretório com 3 arquivos, 1 byte cada, tem um tamanho de diretório de 3 bytes (por minha definição).
Calcular o tamanho do diretório usando du parece não confiável.
Por exemplo, mkdir foo && du -b foo
relata "4096 foo", 4096 bytes em vez de 0 bytes. Com diretórios muito grandes, o tamanho do diretório relatado por du -hs
pode ser desativado em 100 GB (!) E mais (sistema de arquivos compactados).
Então, o que (ferramenta / opção) deve ser usado para obter o tamanho real do diretório?
xfs
por acaso?Respostas:
Aqui está um script exibindo um tamanho de diretório legível por humanos usando as ferramentas padrão do Unix (POSIX).
por exemplo:
fonte
ls
invocações aqui:-q
. Sem essa opção, o script será interrompido se algum nome de arquivo contiver caracteres de nova linha. Escrevendo scripts shell realmente confiáveis é muito difícil ...Algumas versões
du
suportam o argumento--apparent-size
para mostrar o tamanho aparente em vez do uso do disco. Portanto, seu comando seria:Nas páginas de manual do du incluído no Ubuntu 12.04 LTS:
fonte
Apenas uma alternativa, usando
ls
:ls -nR
:-n
like-l
, mas liste UIDs e GIDs numéricos e-R
liste subdiretórios recursivamente.grep -v:
Inverta a sensação de correspondência, para selecionar linhas não correspondentes. (-v é especificado por POSIX.).'^ d'
excluirá os diretórios.Comando Ls: http://linux.about.com/od/commands/l/blcmdl1_ls.htm
Man Grep: http://linux.die.net/man/1/grep
EDIT :
Editado como a sugestão @ Sergey Vlasov.
fonte
-n
opção emls
vez de-l
(mostrar números UID / GID em vez de nomes) é mais seguro, porque os nomes de usuários e grupos podem conter espaços (por exemplo, sewinbind
ousssd
são usados para associar o sistema a um domínio do Windows, você pode obter nomes de grupos comodomain users
) . Também deve ser mais rápido devido à não necessidade de pesquisar nomes de usuários e grupos.Supondo que você tenha
du
do GNU coreutils, esse comando deve calcular o tamanho aparente total do número arbitrário de arquivos regulares dentro de um diretório sem limites arbitrários no número de arquivos:Adicione a
-l
opção adu
se houver alguns arquivos com link interno e você deseja contar cada link separadamente (por padrão,du
conta vários links somente uma vez).A diferença mais importante com plain
du -sb
é que recursivedu
também conta tamanhos de diretórios, que são relatados de maneira diferente por diferentes sistemas de arquivos; para evitar isso, ofind
comando é usado para passar somente arquivos regulares paradu
. Outra diferença é que os links simbólicos são ignorados (se eles devem ser contados, ofind
comando deve ser ajustado).Esse comando também consome mais memória do que o comum
du -sb
, porque o uso do dispositivo de armazenamento de--files0-from=FILE
marcasdu
e números de inode de todos os arquivos processados, em oposição ao comportamento padrão de lembrar apenas arquivos com mais de um link físico. (Isso não é um problema se a-l
opção for usada para contar links físicos várias vezes, porque o único motivo para armazenar números de dispositivo e inode é ignorar arquivos com link físico que já foram processados.)Se você deseja obter uma representação legível do tamanho total, basta adicionar o
-h
opção (Isso funciona porquedu
é invocado apenas uma vez e calcula o próprio tamanho total, ao contrário de algumas outras respostas sugeridas):ou (se você estiver preocupado com a
-b
substituição de alguns efeitos-h
)fonte
-b
provavelmente possa ser substituído por-A -B 1
, não há equivalente para--files0-from=-
, e o usoxargs
precisará de algumas soluções alternativas caso a lista de arquivos seja maior queARG_MAX
(e alguma solução externa para saída legível por humanos).Se tudo o que você deseja é o tamanho dos arquivos, excluindo o espaço que os diretórios ocupam, você pode fazer algo como
@SergeyVlasov apontou que isso irá falhar se você tiver mais arquivos do que
argmax
. Para evitar que você possa usar algo como:fonte
xargs
será chamadodu
várias vezes e cada chamada imprimirá o total geral apenas por sua parte da lista completa de arquivos,tail
mostrará apenas o tamanho total da última parte.