Obtém o tamanho total dos arquivos de um arquivo que contém uma lista de arquivos

12

Eu tenho um arquivo contendo uma lista de arquivos que eu gostaria de saber o tamanho total dos arquivos. Existe um comando para fazer isso?

Meu sistema operacional é um linux muito básico (Qnap TS-410).

EDITAR:

Algumas linhas do arquivo:

/share/archive/Bailey Test/BD006/0.tga
/share/archive/Bailey/BD007/1 version 1.tga
/share/archive/Bailey 2/BD007/example.tga

    
por Nicolas 19.01.2012 / 18:36

7 respostas

12

Acredito que algo assim funcionaria no busybox:

du 'cat filelist.txt' | awk '{i+=$1} END {print i}'

Eu não tenho o mesmo ambiente que você, mas se você encontrar problemas com espaços em nomes de arquivos, algo assim também funcionaria:

cat filelist.txt | while read file;do
  du "$file"
done | awk '{i+=$1} END {print i}'

Editar 1 :
@stew está certo em seu post abaixo, du mostra o uso do disco e não o tamanho exato do arquivo. Para alterar o comportamento, o busybox usa o sinalizador -a, portanto, tente: du -a "$file" para o tamanho exato do arquivo e compare a saída / comportamento.

    
por 19.01.2012 / 19:56
7
du -c 'cat filelist.txt' | tail -1 | cut -f 1

-c adiciona linha "tamanho total";% detail -1 leva a última linha (com tamanho total);% cut -f 1 corta a palavra "total".

    
por 21.09.2015 / 14:52
4
while read filename ;  do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'

Isso é semelhante à solução de Mattias Ahnberg. Usar "read" resolve problemas com nomes de arquivos / diretórios com espaços. Eu uso stat em vez de du para obter o tamanho do arquivo. du está recebendo a quantidade de espaço que está usando no disco em vez do tamanho do arquivo, o que pode ser diferente. Dependendo do seu sistema de arquivos, um arquivo de 1 byte ainda ocupará 4k no disco (ou qualquer que seja o tamanho do bloco). Então, para um arquivo de 1 byte, stat diz 1 byte e du diz 4k.

    
por 19.01.2012 / 20:22
4

Eu não sei se suas ferramentas Linux são capazes disso, mas:

cat /tmp/filelist.txt  |xargs -d \n du -c

Faça, o xargs irá definir o delimitador para ser um caractere de nova linha, e du irá produzir um total geral para você.

Olhando para o link , parece que o "busybox du" suportará a opção total geral, mas o "busybox xargs" não suportará delimitadores personalizados.

Novamente, não tenho certeza do seu conjunto de ferramentas.

    
por 19.01.2012 / 19:06
3

Aqui está outra solução para o problema:

cat filelist.txt | tr '\n' '
cat filelist.txt | tr '\n' '%pre%' | wc -c --files0-from=-
' | wc -c --files0-from=-
    
por 31.12.2012 / 07:21
2

Tente algo assim:

$ cat filelist.txt | xargs ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

Para lidar adequadamente com espaços em caminhos:

$ find /path/to/files -type f -print0 | xargs -0 ls -l | awk '{x+=$5} END {print "total bytes: " x}' 
    
por 19.01.2012 / 18:43
1

cat docs.txt | xargs -d \n du -sk | awk '{total+=$1} END{print total}'

    
por 12.03.2016 / 08:32

Tags