Resposta rápida : altere a linha para
tar -cf - "${filestobackup[@]}" | pv -s $(du -cb "${filestobackup[@]}" | tail -1 | awk '{print $1}') | gzip > archive.tar.gz
Resposta longa : O problema é que du produzirá várias linhas de saída e não apenas uma, como no caso de um único diretório. O interruptor -s faz du imprimir o tamanho total para cada entrada. Como você está passando várias entradas para du (duas para a pasta1 e a pasta2, mais uma para cada arquivo .db na pasta 3), du imprimirá algo como:
2112345 opt/folder1
57148 opt/folder2
388 opt/folder3/foo.db
161 opt/folder3/bar.db
Ao usar o comutador -c , du imprime uma última linha contendo o total geral. Para usar esse valor, você precisa filtrar du output para obter apenas a última linha.
Isso pode ser feito com o awk, que você já usa no pipe, ou, mais simplesmente, embora com uma penalidade (menor) no desempenho, adicionando um filtro tail -1 .