Existem dois fatores limitantes ao considerar os caracteres permitidos em um nome de arquivo - restrições relacionadas ao sistema operacional e restrições relacionadas ao sistema de arquivos. Para essa questão, presumo que estamos falando de versões recentes do Linux e do ext4.
O Linux apenas não permite dois caracteres em nomes de arquivos: / , porque é o separador de caminho e (ASCII NUL), porque termina os cstrings. Além disso, os nomes especiais ... e %code% também são reservados pelo sistema de arquivos para uso como links físicos de navegação.
Você pode demonstrar facilmente que os outros personagens mencionados na sua pergunta são permitidos:
$ touch '\' '?' '!'
$ ls
! ? \