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 há 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"