In principle, it can, but if it is to be used by the command line, it needs "escape" or quotes in Unix. Although it is accepted in the filename, in Shell it has a special meaning, it separates commands. In Windows it is accepted without restrictions.
As a complement, Wikipedia has a very good compendium of file name information:
Article: Filename .
In particular, I've translated this table listing the special characters in the most common (and not all) filesystems:
/ barra Usada como separador de caminho em sistemas Unix-like,
Windows e Amiga (a variável SwitchChar do DOS pode ser
setada para '/' e o COMMAND.COM considerará como indicador
de flag, mas o DOS e o Windows mesmos aceitam como
separador na API)
\ barra invertida Usada como separador padrão no DOS, OS/2 e Windows (mesmo
com SwitChar configurado para '-'; é aceito em nomes Unix)
? interrogação É usado como coringa em Unix, Windows, Amiga, e representa
um caractere único. É permitido em nomes Unix
% porcentagem É um coringa em RT-11, define um caractere único. Em Windows
pode ser usado
* asterisco Usado como coringa em Unix, DOS, RT-11, VMS e Windows.
Representa uma sequência de caracteres em Unix, Windows, DOS,
ou qualquer sequência na extensão (*.* significa "todos os
arquivos"). Em Unix, pode ser usado nos nomes de arquivo
: dois pontos Serve para determinar o ponto de montagem no Windows, o
dispositivo virtual ou físico no Amiga, RT-11 e VMS e é o
separador de caminho no MacOS Clássico. No VMS, indica um
nome de nó DECnet quando usado em dobro (equivale a um endereço
NetBios. No Windows ainda é usado para separar um Data Stream
do nome de arquivo em NTFS
| barra vertical Define um redirecionamento de software em Unix, DOS e Windows;
ou pipe Permitido em nomes Unix
" aspas duplas Usadas para delimitar nomes com espaços em Windows
< menor que Usado para redirecionar entrada, permitido em Unix
> maior que Usado para redirecionar saída, permitido em Unix
. ponto Permitido, mas a última ocorrência indica separador de extensão
em VMS, DOS, e Windows. Em outros sistemas, normalmente faz parte
do nome, e pode ter mais de uma ocorrência seguida. Normalmente, em
Unix indica que o nome deve ser escondido da listagem
espaço É permitido, mas como também é um separador de parâmetros de linha
de comando, deve-se delimitar o nome com aspas para diferenciar dos
parâmetros
Important: In Unix, although accepted, <>|\:()&;#?*
faults usually need to be "escaped" with backslashes, or delimited with quotation marks on the command line:
Ex: five\ and\ six\<seven
or even "five and six<seven"
.
Considerations:
Just because you can use certain characters does not mean you should use them. The recommendation is to use "less common" characters only where there is a reason that can not be circumvented by other means, such as normalization and sanitization.
Thinking about interoperability, even using allowed characters, simple case-sensitivity is a very common problem when exchanging files between different OSes, because in Windows there is no differentiation, and a considerable number of other OSes there. As the use of special characters also varies, a lot of headache is avoided if it is limited to a simplified nomenclature (staying in the range a-z0-9_.
for example is a good request).
Accentuation and formatting make sense for things manipulated only by the end user (cake recipe, cover letter, washing machine financing installment spreadsheet, these things), but files that need to be processed by a system deserve careful bigger. Personally, I think it's a crime to do as I see a lot here on the site, to make a point of keeping original file upload names, when it would be much simpler to store the names in the DB and simply put a sequential string in the filesystem.