Quais caracteres são seguros em nomes de arquivos multiplataforma para Linux, Windows e OS-X

43

Atualmente, uso um nome YYMMDD-NAME+PAGE para a maioria dos meus arquivos. NAME tem espaços convertidos em sublinhados.

Gostaria de usar o formato YYYY-MM-DD date, mas não sei como separá-lo do nome. Um - pareceria estranho se o nome começasse com um número. Se eu usar um _ , ele entrará em conflito com o sublinhado representando um espaço.

Quais caracteres são razoavelmente seguros em nomes de arquivos que funcionariam aqui? Estou no Linux, mas posso compartilhar arquivos com outras pessoas (Windows 7, Mac OS X).

    
por Martin Ueding 18.11.2011 / 11:32

3 respostas

38

Resumo:

  • Windows: qualquer coisa, exceto os caracteres de controle do ASCII e \/:*?"<>|
  • Linux, OS-X: qualquer coisa, exceto nulo ou /

Em todas as plataformas, é melhor evitar caracteres não imprimíveis, como os caracteres de controle ASCII.

Windows

No Windows, o Windows Explorer não permite caracteres de controle ou \/:*?"<>| . Você pode usar espaços. Se você usa espaços, frequentemente terá que citar o nome do arquivo quando usado a partir da linha de comando (mas os aplicativos de GUI não são afetados até onde eu sei). O sistema de arquivos do Windows, como o NTFS, aparentemente armazena a codificação com o nome do arquivo, mas o UTF-16 é padrão.

Algumas partes do Windows diferenciam maiúsculas de minúsculas, outras não fazem distinção entre maiúsculas e minúsculas. É fácil criar nomes de arquivos distintos como "Ab" e "ab" em um sistema de arquivos Windows NTFS. Esses nomes referem-se a arquivos separados que contêm conteúdo separado distinto. No entanto, embora o prompt de comando do Windows tenha a satisfação de listar os dois arquivos usando dir , você não poderá acessar ou manipular facilmente um deles usando comandos como type . Veja abaixo.

Linux, OS-X

No Linux e no OS-X, apenas / do conjunto ASCII imprimível é proibido, acredito. Alguns caracteres (metacaracteres de shell como *?! ) causarão problemas nas linhas de comando e exigirão que o nome do arquivo seja adequadamente citado ou com escape.

Sistemas de arquivos Linux, como ext2, ext3, são agnósticos para conjuntos de caracteres (acho que eles apenas o tratam mais ou menos como um fluxo de bytes - somente nulos e / são proibidos). Isso significa que você pode armazenar nomes de arquivos na codificação UTF-8. Acredito que cabe ao shell ou a outro aplicativo saber qual codificação usar para converter corretamente o nome do arquivo para exibição ou processamento.

Conclusão

Então você provavelmente poderia usar com segurança algo como (se não fosse tão difícil de digitar)

Sensibilidade ao caso (in) no Windows

C> dir /B
Ab
aB
аB

C> type Ab
b
b

C> type aB
b
b

C> type аB
unicode homograph

Observe que não podemos digitar o conteúdo do segundo arquivo, o comando type do Windows apenas retorna o conteúdo de Ab. O terceiro arquivo também seria diferente de aB no Linux.

(Windows 10 NTFS).

    
por 18.11.2011 / 12:18
36

Enquanto a resposta da RedGrittyBrick é tecnicamente correta, a segurança não é o único problema: a usabilidade também é importante. Acho que uma pergunta melhor é "quais caracteres são bons para usar em um nome de arquivo".

Algumas diretrizes possíveis:

  • [0-9a-zA-Z _] - Caracteres alfanuméricos e o sublinhado são sempre bons para usar.
  • \/:*?"<>| e null byte são problemáticos em pelo menos um sistema, e devem sempre ser evitados.
  • Espaços são usados como separadores de argumentos em muitos sistemas, portanto, nomes de arquivos com espaços devem ser evitados sempre que possível.
  • Ponto e vírgula (;) é usado para separar comandos em muitos sistemas.
  • []()^ #%&!@:+={}'~ e ['] todos têm significados especiais em muitos shells, e são irritantes para contornar, e por isso devem ser evitados. Eles também tendem a parecer horríveis em URLs .
  • Caracteres principais para evitar:
    • Muitos programas de linha de comando usam o hífen [-] para indicar argumentos especiais.
    • Os sistemas baseados em
    • * nix usam um ponto final [.] como um caractere principal para arquivos e diretórios ocultos.
  • Qualquer coisa que não esteja no conjunto ASCII pode causar problemas em sistemas mais antigos ou mais básicos ( por exemplo, alguns sistemas embarcados), e deve ser usado com cuidado.

Isso basicamente deixa você com:

[0-9a-zA-Z -., _]

que são sempre seguros e não irritantes de usar (contanto que você inicie o nome do arquivo com um alfanumérico):)

    
por 01.05.2014 / 04:35
4

Você poderia:

  1. substitua os sublinhados atuais por # (símbolo do revisor para o espaço)
  2. sublinhado para a 'seção' data do nome do arquivo (ou um segundo hífen - mais fácil de digitar)

Alt-1. inicializantes podem substituir espaços: YYMMDD-HHMM-FileName.ext ou YYMMDD-HHMM_FileName.ext

Caracteres mínimos para exibição clara, que classifica automaticamente com zeros preenchidos para Jan-Set (e 1º a 9º mês).

    
por 06.09.2012 / 07:44

Tags