Dialog progress indicator bar that includes the last n lines out processing output, (in this case, simply listing every file in a filesystem).

#!/usr/bin/env bash
 
set -euo pipefail
 
used_inodes () {
  df --output=iused "$1" | tail -1
}
 
join_by () {
  local IFS="$1"; shift
  echo "$*"
}
 
progress_bar () {
  declare total="$1" width="$2" textlines="$3" title="${4:-Progress}"
 
  declare -a text=($(printf '_ %.0s' { 1 .. $textlines }))
  declare -i trimchars=$(( width - 4 )) slicelines=$(( textlines - 1 ))
  declare -i height=$(( textlines + 5 ))
  declare -i count=0
 
  while read -r file; do
    text=("${text[@]:1:$slicelines}")
    text+=("${file:0:$trimchars}")
    count=$(( count + 1 ))
    declare -i percent=$((200*$count/$total % 2 + 100*$count/$total))
    printf 'XXX\n%s\n%s\nXXX\n' "$percent" "$(join_by $'\n' "${text[@]}")"
  done | dialog \
    --title "$title" \
    --gauge "" \
    $height $width 0
}
 
main () {
  declare path="${1:-/}"
  declare total=0
  total=$(used_inodes "$path")
  find "$path" -xdev | progress_bar $total 70 5
}
 
main "$@"