Для этой ситуации я бы рекомендовал использовать find. Вы можете указать пути для исключения, используя -not -i whilename 'PATH'. Затем с помощью exec вы выполняете команду, которую хотите выполнить
find . -not -iwholename './var/foo*' -exec chown www-data '{}' \;
Хотя это, вероятно, помогает в вашей ситуации, я также видел сценарии, устанавливающие флаг неизменности. Убедитесь, что вы убрали флажок, когда закончите, вы должны использовать ловушку для этого на случай, если скрипт будет убит досрочно (примечание: запускается из скрипта, код ловушки запускается при выходе из сеанса bash). В моем варианте много проблем, но в некоторых ситуациях это хорошо.
cd /var
trap 'chattr -R -i foo > /dev/null 2>&1' 0
chattr -R +i foo
chown -R www-data *