Soma todos os tamanhos de arquivo

0

Sou novo no bash e preciso fazer um pequeno script para somar todos os tamanhos de arquivo, excluindo os subdiretórios. Minha primeira ideia foi manter as colunas quando você fez ls -l . Eu não posso usar grep, du ou outros comandos avançados que eu vi por aqui.

$ 9 corresponde à 9ª coluna onde o nome é mostrado.

$ 5 é o tamanho do arquivo.

ls -l | awk '{if(-f $9) { total +=$5 } }; END { print total }
    
por Arnau Martínez 24.02.2018 / 03:28

5 respostas

3

Com o GNU find e o awk:

find . -maxdepth 1 -type f -printf "%s\n" | awk '{sum+=$1} END{print sum}'

A saída é o tamanho do arquivo em bytes.

    
por 24.02.2018 / 03:39
1

Usando wc :

wc -c * 2> /dev/null

Se tudo o que é necessário é o total, faça:

wc -c * 2> /dev/null | tail -1
    
por 24.02.2018 / 08:55
1

Se você está procurando uma forma shell script-bash para fazer isso, aqui está um loop de shell que reúne todos os arquivos (arquivos de ponto incluídos), então usa o utilitário GNU coreutils stat para imprimir seu tamanho em uma variável de soma.

shopt -s dotglob
sum=0
for f in *
do 
  [[ -f "$f" && ! -h "$f" ]] || continue
  sum=$(( sum + $(stat -c "%s" "$f") ))
done
echo $sum

O Bash considera os links simbólicos como "arquivos regulares", portanto, é necessário ignorá-los com o -h test.

    
por 25.02.2018 / 03:29
0

Podemos usar o comando abaixo também

find . -maxdepth 1 -type f -exec ls -ltr {} \;| awk 'BEGIN{sum=0} {sum=sum + $5} END {print sum}'
    
por 24.02.2018 / 10:07
0

Como era um exercício muito básico, o professor exigia os exercícios usando comandos básicos que requeriam um pouco mais de desenvolvimento e podiam ser substituídos por comandos mais poderosos, como find ou stat, mais tarde. Mas eu tenho a resposta e foi isso:

dir=$1
if [ ! -d $dir ]
then 
   exit 1
else

sum=0
cd $dir

(ls -l $dir) > fitxers.txt

C=($(awk '{print $5}' fitxers.txt))

len=${#C[*]}

i=0

while [ $i -lt $len ]
do 
    for element in $(ls $dir)
    do
        if [ -f $element ]
            then
            let "sum = $sum + ${C[$i]}"
            fi 
        (( i++ ))
    done
done
echo $sum
rm -r fitxers.txt
exit 0
fi

Espero que seja um pouco útil para outros iniciantes.

    
por 15.03.2018 / 13:10