O comando find tem que ter uma maneira de dizer onde o comando que deve ser executado através de -exec termina. Sem o ; no final do comando, find não saberia onde o comando terminava e onde (possivelmente) outros find sinalizadores continuavam.
Um exemplo absurdo que executa basename em todos os arquivos e ls em todos os diretórios:
find . '(' -type f -exec basename {} ';' ')' -o '(' -type d -exec ls {} ';' ')'
Sem o ; acima, find não saberia se deve executar basename /some/path ou basename /some/path ')' -o '(' ... etc.
Citar ou escapar do ; é feito apenas para que o shell não o trate como um delimitador de comando.
Um exemplo menos sem sentido que primeiro copia .txt arquivos para um diretório específico e renomeia os arquivos originais adicionando .done ao nome deles (se a cópia foi aprovada):
find . -type f -name '*.txt'
-exec cp {} /some/path/dest ';' \
-exec mv {} {}.done ';'
(Note, como Eliah Kagan aponta em comentários, que a construção {}.done é estritamente falando não portável, mas implementação definida . Uma implementação pode escolher não expandir os caracteres {} para Na minha experiência, todas as find implementações do expandem {} para o nome do caminho atual mesmo quando concatenadas com outra string como essa.)
Sem o ; no exemplo anterior, find não saberia se queremos executar o comando cp no arquivo encontrado junto com /some/path/dest , um arquivo chamado -exec , mv etc.