Nomes de arquivos do Linux / Windows / Unix /…: quais caracteres são permitidos? Quais são sem escape?

43

Quais caracteres são permitidos e quais devem ser escapados na linha de comando em diferentes sistemas operacionais?

java.is.for.desktop
fonte
Existem algumas respostas úteis abaixo, mas o que você está tentando alcançar? Codificar suas próprias rotinas de lista branca de personagens provavelmente não é a melhor rota.
medina
Obrigado a todos! Todas as respostas são úteis. O que eu preciso das informações é: Estou escrevendo uma ferramenta que identifica os arquivos no sistema de arquivos, alterando seus nomes (sem metadados).
Java.is.for.desktop 13/06
Consulte também resposta sobre superusuário .
pevik

Respostas:

27

Há uma discussão sobre os caracteres do nome do arquivo no artigo da Wikipedia sobre Nomes de arquivos .

Você pode encontrar este ensaio informativo: Corrigindo nomes de arquivos Unix / Linux / POSIX .

Este artigo compara o OS X e o Windows XP: X vs. XP: caracteres proibidos nos nomes de arquivos (PDF, consulte as páginas aproximadamente 64-66).

Coisas que não devem constar em nomes de arquivos por US $ 1.000

Não sei quais caracteres devem ter escape sem escape, mas no Linux, provavelmente não é uma boa ideia escapar dos caracteres que podem ter um significado especial, como "n" (nova linha), "t" (guia) e outros, mas isso geralmente não é um problema nas operações de arquivo. Talvez você queira dizer "escapou" ao invés de "escapou". Os mais comuns são aqueles que o shell interpretará, como espaço, ">", "<" etc. Veja alguns dos artigos que eu vinculei para uma discussão sobre eles.

Dennis Williamson
fonte
7
Esta não é realmente uma resposta - todas as informações são externas. E alguns desses links estão quebrados agora.
21816 Steve Bennett
26

Os únicos caracteres não permitidos em um nome de arquivo em * nix são NULe /. No Windows, única NUL, :e \são realmente não é permitido, mas muitos aplicativos restringir que mais, também impedindo ?, *, +, e %.

Em nenhum momento, nenhum caractere em um nome de arquivo precisa ser escapado, exceto conforme necessário, a fim de não ser interpretado pelo shell.

Ignacio Vazquez-Abrams
fonte
O segundo ponto merece ênfase. Normalmente, "escape" refere-se a um mecanismo de shell que permite ao usuário especificar seqüências de caracteres (por exemplo, nomes de caminho) que contêm caracteres que o shell trataria de uma maneira especial. Se o OP significa usar algo como "porcentagem de codificação" para codificar caracteres não permitidos, então esse é um "protocolo de nome de caminho" no nível da aplicação que cada programa envolvido deve adotar (ou não).
precisa
Estou digitalizando uma pasta com o readdir e tentando abrir os arquivos com os nomes que ela retorna. Alguns deles não conseguem abrir com o ENOENT, o que sugere que, mesmo para o sistema operacional, às vezes você precisa escapar?
gman
13

Se você criar um arquivo no Windows com o Explorer usando um dos seguintes caracteres, ele reclamará que os caracteres não são permitidos:

\ / : * ? " < > |

Uma boa referência está aqui:

Nomeando arquivos, caminhos e espaços para nome
http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx

A Microsoft declara ainda:

"... nas plataformas de desktop baseadas no Windows, os caracteres de caminho inválidos podem incluir caracteres ASCII / Unicode 1 a 31, além de aspas ("), menores que (<), maiores que (>), pipe (|), backspace (\ b), nulo (\ 0) e tabulação (\ t). "

http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidpathchars.aspx

Greg Askew
fonte
Lembro-me de ler alguns anos atrás que o Windows em modo de usuário tem essas restrições e não diferencia maiúsculas de minúsculas ("ABC.txt" === "abc.txt"). No entanto, o Windows no modo kernel possui menos restrições e faz distinção entre maiúsculas e minúsculas ("ABC.txt"! == "abc.txt", assim como * NIX). Para todos os efeitos, os caracteres acima serão aplicados à maioria dos programas, porque são executados no modo de usuário.
precisa saber é o seguinte
Eu posso escapar de \ / : * ? " < > |todos eles e criá-los com o mkdir no meu sistema GNU / Linux. Você pode usar mkdir '?'para criar o ?diretório também. Eu usei o sistema de arquivos ramdisk e XFS para testar isso.
S.Goswami 30/09
5

No Linux e em outros sistemas compatíveis com POSIX, "/" é reservado, pois é o separador de diretório e "\ 0" (o caractere NULL) designa o final da sequência. Tudo o resto é permitido.

janneb
fonte
1
Embora seja altamente recomendável evitar novas linhas, guias, caracteres de controle e similares, além de garantir que o nome do arquivo seja UTF-8 válido.
Flimm