Como mostrar apenas o tamanho total do arquivo de uma extensão específica pelo comando `du`

11

Eu tenho centenas de arquivos pdf e arquivos html em um diretório. E eu quero saber o tamanho total dos arquivos pdf.

Por comando du -ch /var/foo, posso ver o tamanho total do arquivo, mas só preciso da última linha, o tamanho total.

Se o diretório contiver apenas arquivos pdf, eu posso usar a -sopção, mas a opção não pode ser usada neste momento.

Como posso obter apenas o tamanho total de um determinado tipo de arquivo?

ferros e areias
fonte
Você não pode usar como du -sh /foo/*.pdf?
bagavadhar
2
du -ch /var/foo/*.pdf | tail -n 1
don_crissti

Respostas:

10

Com o GNU du(ou seja, no Linux ou Cygwin não incorporado), você pode usar a --excludeopção para excluir os arquivos que não deseja corresponder.

du -s --exclude='*.html' /var/foo

Se você deseja corresponder positivamente *.pdfarquivos, você precisará usar algum outro método para listar os arquivos, e duvai pelo menos exibição uma linha de saída por argumento, além de um grande total com a opção -c. Você pode ligar tailpara remover tudo, exceto a última linha, ou sed para remover a palavra "total" também. Para enumerar os arquivos nesse diretório, use curingas no shell.

du -sc /var/foo/*.pdf | tail -n1
du -sc /var/foo/*.pdf | sed -n '$s/\t.*//p'

Se você precisar atravessar arquivos em subdiretórios também, use findou use um **/padrão se o seu shell suportar isso. Para **/, no bash, primeira execução shopt -s extglob, e observe que as versões do bash até 4.2 atravessarão links simbólicos para diretórios; no zsh, isso funciona imediatamente.

du -sc /var/foo/**/*.pdf | tail -n1

Uma complicação adicional da versão find é que, se houver muitos arquivos, findserá executado dumais de uma vez, para manter o limite de comprimento da linha de comando. Com o método curinga, você receberá um erro se isso acontecer ("limite do comprimento da linha de comando excedido"). O código a seguir supõe que você não tenha nenhum nome de arquivo correspondente que contenha uma nova linha.

find /var/foo -name '*.pdf' -exec du -sc {} + |
awk '$2 == "total" {total += $1} END {print total}'
Gilles 'SO- parar de ser mau'
fonte
(provavelmente não um problema na prática, mas nota que --exclude='*.html'faria com que /var/foo/dir.html/foo.pdfnão sejam contados como as exclusões também afetam passagem de diretório, também, o uso do disco de diretórios, incluindo /var/fooem si seriam contabilizados)
Stéphane Chazelas
3

Você pode deixar o shell expandir os arquivos:

$ mkdir foo
$ echo "abc" > foo/1.pdf
$ echo "abcd" > foo/2.pdf
$ echo "abcd" > foo/3.html
$ du -ch foo/*.pdf
4,0K    foo/1.pdf
4,0K    foo/2.pdf
8,0K    total

No entanto, como você pode ver, isso indica que o tamanho do arquivo é cerca de 1000 vezes maior que o criado. Uma opção melhor é usar a -bopção:

$ du -cbh foo/*.pdf
4   foo/1.pdf
5   foo/2.pdf
9   total

Grandes tamanhos de arquivos ainda serão exibidos na forma legível por humanos - por exemplo 173K.

Anthon
fonte
dumostra o uso do disco de cada arquivo (na maioria dos sistemas de arquivos, esse é o tamanho do arquivo arredondado para o próximo múltiplo do tamanho do bloco). Com a opção -b, dumostra o tamanho de cada arquivo.
Gilles 'SO- stop be evil'