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
! ? \