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.
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 }
Usando wc
:
wc -c * 2> /dev/null
Se tudo o que é necessário é o total, faça:
wc -c * 2> /dev/null | tail -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.
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}'
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.
Tags bash ls files awk shell-script