Como mostrar apenas o tamanho total do arquivo de extensão particular pelo comando 'du'

8

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

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

Se o diretório contiver somente arquivos pdf, eu posso usar a opção -s , mas a opção não pode ser usada desta vez.

Como posso obter apenas o tamanho total do tipo de arquivo específico?

    
por ironsand 10.11.2014 / 11:54

2 respostas

6

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

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

Se você quiser corresponder positivamente os arquivos *.pdf , será necessário usar outro método para listar os arquivos, e du exibirá pelo menos uma linha de saída por argumento, além de um total geral com a opção% código%. Você pode chamar -c para remover todos, 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 percorrer arquivos em subdiretórios, use tail ou use um padrão find se o seu shell suportar isso. Para **/ , no bash, primeiro execute **/ , e observe que versões bash até 4.2 irão percorrer links simbólicos para diretórios; em zsh, isso funciona fora da caixa.

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

Uma complicação adicional com a versão find é que, se houver muitos arquivos, shopt -s extglob executará find mais 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 de comprimento da linha de comando excedido”). O código a seguir assume que você não tem 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}'
    
por 11.11.2014 / 02:11
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 este indiates filesizes cerca de 1000 vezes como apenas criado. Uma opção melhor é usar a opção -b :

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

Grandes arquivos ainda serão exibidos em formato legível por humanos - por exemplo, %código%.

    
por 10.11.2014 / 12:06