"Não use ls em scripts" é um problema com POSIX ls "only"; para o GNU ls, consulte --quoting-style=
.
A classificação do GNU resolve o problema com --zero-terminated
.
Se for compatível, você pode usar find ... -exec
para passar um nome de arquivo de cada vez para um script que faz o escape. Se pelo menos o bash estiver disponível:
start cmd:> testfunc () { echo "${1//$'\n'/\n}"; }
start cmd:> testfunc a$'\n'b
a\nb