Soma total de bytes de arquivos

4

Se eu tiver arquivos a , b e c em um diretório em uma máquina Linux. Como posso obter o número total de bytes desses três arquivos de uma maneira que não depende de como, por exemplo, ls mostra a informação? Quer dizer, eu estou interessado em uma maneira que não seja propensa a erros

Atualizar
1) Estou interessado em arquivos binários não arquivos ascii
2) Seria ideal ser uma solução portátil, e. GNU Linux ou Mac trabalhando

    
por Jim 29.09.2017 / 15:29

7 respostas

10

Use du com as opções -c (total de impressão) e -b (bytes):

$ ls -l
total 12
-rw-r--r-- 1 terdon terdon  6 Sep 29 17:36 a.txt
-rw-r--r-- 1 terdon terdon 12 Sep 29 17:38 b.txt
-rw-r--r-- 1 terdon terdon 17 Sep 29 17:38 c.txt

Agora, execute du :

$ du -bc a.txt b.txt c.txt
6   a.txt
12  b.txt
17  c.txt
35  total

E se você quiser apenas o tamanho total em uma variável:

$ var=$( du -bc a.txt b.txt c.txt | tail -n1 | cut -f1)
$ echo $var
35
    
por 29.09.2017 / 16:41
8

Usando stat e awk :

$ stat --printf '%s\n' some individual files here | awk '{ s += $1 } END { print s }'

stat com o formato --printf fornecido (no Linux) exibirá os tamanhos de arquivo dos arquivos fornecidos. O código awk , em seguida, soma esses valores e informa o total geral.

Para macOS:

$ stat -f '%z' some individual files here | awk '{ s += $1 } END { print s }'

O utilitário stat não é portátil, mas você pode envolvê-lo em um script de shell de portabilidade (ou função shell):

#!/bin/sh

case $(uname) in
    Linux)       stat --printf '%s\n' "$@" ;;
    Darwin|*BSD) stat -f '%z' "$@" ;;
    *) echo 'Unknown system. I do not know how stat works here' >&2
       exit 1 ;;
esac | awk '{ s += $1 } END { print s }'

Isso seria chamado de

$ ./script a b c

onde a , b e c são os arquivos cujo tamanho em bytes você gostaria de adicionar.

Outra solução seria instalar o GNU coreutils no sistema macOS para obter acesso à mesma implementação stat do que no Linux.

No Linux, você também seria capaz de fazer

$ du -bcl some individual files here | awk 'END { print $1 }'

mas não há equivalente a isso no macOS ou nos sistemas BSD (o -b flag não está implementado) a menos que o GNU coreutils esteja instalado.

    
por 29.09.2017 / 15:36
8

Com o% GNUfind, você pode fazer:

find a.txt b.txt c.txt -prune -printf '%s\n' | paste -sd + - | bc

Isso dá o tamanho conforme relatado por ls -l ou a chamada do sistema stat() . Para tipos de arquivos não regulares (como fifo, device, symlink), dependendo do sistema, isso pode não necessariamente fornecer o número de bytes que seriam lidos a partir deles, se fossem. Veja para mais opções para eles.

Você poderia fazer:

cat a.txt b.txt c.txt | wc -c

para isso, mas isso não é algo que você gostaria de fazer para fifos ou alguns arquivos de dispositivo como /dev/zero ou /dev/random .

Você pode adicionar a opção -L ao comando find para resolver links simbólicos e obter o tamanho do destino.

POSIXly, o único comando que pode obter o tamanho do arquivo retornado pela chamada do sistema lstat() é ls infelizmente.

ls -l não retorna o tamanho dos dispositivos de bloco. É muito difícil analisar sua saída de forma confiável e só pode ser feito de maneira segura (para implementações compatíveis e para arquivos que não sejam de dispositivo) para um arquivo de cada vez:

getsize() {
  LC_ALL=C ls -nd -- "$1" | awk '
   {
     if (/^[cb]/) print 0
     else print $5
     exit
   }
   END {exit (!NR)}'
}

(aqui assumindo um tamanho de 0 para arquivos de dispositivos que é sempre verdadeiro no Linux, mas não em todos os sistemas).

Então você pode fazer:

sum=0
for file in a b c; do
  sum=$((sum + $(getsize "$file")))
done
echo "$sum"
    
por 29.09.2017 / 16:17
7

how can I get the total number of bytes of these 3 files

wc + abordagem sed :

wc -c a.txt b.txt c.txt | sed '$!d;s/total//;'
  • wc -c [FILE]... - imprime a contagem de bytes para cada arquivo especificado. Para vários arquivos imprime a linha com número total de bytes (como a última linha)
por 29.09.2017 / 16:17
4

Concatene todos os arquivos e use wc para contar os bytes.

cat a.txt b.txt c.txt | wc -c

Observe que isso será lento para arquivos muito grandes, já que é necessário lê-los. As soluções que usam comandos como stat e find para obter as contagens de bytes dos metadados e as soma provavelmente serão mais rápidas.

    
por 30.09.2017 / 09:05
2

du será capaz de resolver seu problema. du mostrará o tamanho dos arquivos e, em seguida, o tamanho de todos os arquivos resumidos em seu diretório.

du -h /path/to/dir

du - estimate file space usage

    
por 29.09.2017 / 15:34
1

Digamos que você tenha um diretório files sob o qual você tem a.txt b.txt c.txt . Tente isto:

du -sb files

Um exemplo de saída pode ser:

du -sb files
492777810   files

492777810 é o número de bytes.

    
por 29.09.2017 / 15:37

Tags