Teste a extração do arquivo separadamente, depois conte o número de arquivos, se for bem-sucedido. Se você não souber o nome do diretório em que o arquivo é extraído, crie um novo diretório e extraia o arquivo lá. Talvez algo assim:
#!/bin/sh
if [ -d extracted ]; then
echo 'please remove directory "extracted"' >&2
exit 1
fi
mkdir extracted
if ! tar -xvz -f bad_file.tar.gz -C extracted; then
echo 'extraction failed' >&2
echo 'directory "extracted" may contain partially extracted archive' >&2
exit 1
fi
# extraction of archive was successful, count files extracted
find extracted -type f -exec echo . ';' | wc -l
O find
no final gera um ponto para cada arquivo no diretório extracted
. wc -l
conta o número de pontos. Fazemos isso desta forma, caso um nome de caminho no diretório extraído contenha uma nova linha incorporada.