Quais caracteres são seguros nos nomes de arquivos de plataforma cruzada para Linux, Windows e OS-X

60

Atualmente, eu uso um YYMMDD-NAME+PAGEnome para a maioria dos meus arquivos. NAMEpossui espaços convertidos em sublinhados.

Gostaria de usar o YYYY-MM-DDformato da data, mas não sei como separá-lo do nome. A -pareceria estranho se o nome começasse com um número. Se eu usar a _, ele entrará em conflito com o sublinhado que representa um espaço.

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

Martin Ueding
fonte
… No Unix, Windows, um Amiga 1000?
slhck
Principalmente Linux moderno.
22811 Martin Ueding
- símbolo é seguro para uso em windows 7 .. pode ser outro sistema operacional moderno que mesmo .. você pode usar menos símbolo para separar ..
Niranjan Singh
possível duplicado cross site de: stackoverflow.com/questions/4814040/...
Ciro Santilli新疆改造中心法轮功六四事件

Respostas:

48

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.

janelas

No Windows, o Windows Explorer não permite caracteres de controle ou \/:*?"<>|você pode usar espaços. Se você usa espaços, geralmente precisará citar o nome do arquivo quando usado na linha de comando (mas os aplicativos 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 diferenciam maiúsculas de minúsculas. É fácil criar nomes de arquivos distintos como "Ab" e "ab" em um sistema de arquivos Windows NTFS. Esses nomes se referem a arquivos separados que contêm conteúdo separado distinto. No entanto, embora o prompt de comando do Windows liste com satisfação os dois arquivos dir, não é possível acessar ou manipular facilmente um deles usando comandos como type. Ver abaixo.

Linux, OS-X

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

Os sistemas de arquivos Linux, como ext2, ext3, são agnósticos no conjunto de caracteres (acho que eles o tratam mais ou menos como um fluxo de bytes - apenas 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 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 digitar)


Sensibilidade a maiúsculas e minúsculas 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 typecomando do Windows apenas retorna o conteúdo de Ab. O terceiro arquivo também seria distinto do aB no Linux.

(Windows 10 NTFS).

RedGrittyBrick
fonte
11
No geral, uma boa resposta, mas eu evitaria usar nomes de arquivos nos espaços. Escapá-los adequadamente em todos os contextos é mais problemático do que vale a pena. Observe que a Microsoft parou de usar espaço nos nomes de diretório do sistema. Se você precisar indicar os limites das palavras nos nomes, o CamelCase funciona bem.
Isaac Rabinovitch
4
"C: \ Arquivos de programas (x86)" ainda existe no Win8 - isso não é um diretório do sistema? Concordo que os espaços podem causar problemas.
RedGrittyBrick
É, mas pode ser renomeado para praticamente qualquer coisa. Obviamente, muitos programas surtarão se você renomeá-lo para "]: \ foobar", mas o Windows se refere a ele como "% programfiles (x86)%" de qualquer maneira.
Marcks Thomas
2
Algo a ter em mente aqui: o sistema linux pode considerar maiúsculas e minúsculas como distintas, enquanto o Windows as considera iguais.
thecoshman
11
Você ficaria surpreso com quantos programas são ruins ao analisar. É por isso que não havia o Windows 9.
Isaac Rabinovitch
46

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

Algumas diretrizes em potencial:

  • [0-9a-zA-Z_] - Os caracteres alfanuméricos e o sublinhado são sempre bons de usar.
  • \/:*?"<>|e o byte nulo são problemáticos em pelo menos um sistema e devem sempre ser evitados.
  • Os espaços são usados ​​como separadores de argumentos em muitos sistemas; portanto, os nomes de arquivos com espaços devem ser evitados quando possível. Outros espaços em branco (por exemplo, guias) ainda mais.
  • Ponto e vírgula (;) são usados ​​para separar comandos em muitos sistemas. Ponto e vírgula e vírgulas (,) são usados ​​para separar argumentos da linha de comando (algumas versões da?) Na linha de comando do Windows.
  • []()^ #%&!@:+={}'~e [ `] todos têm significados especiais em muitas conchas, e são irritantes para trabalhar ao redor, e por isso deve ser evitado. Eles também tendem a parecer horríveis nos URLs .
  • Personagens principais a serem evitados:
    • 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 usada com cuidado.

Isso basicamente deixa você com:

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

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

naught101
fonte
11
As chaves ( []) fazem parte de expressões regulares e também têm um significado especial no shell. Mas eles não são tão ruins de se trabalhar, exceto em alguns casos extremos.
Martin Ueding
11
Hmm ... acho que o mesmo poderia ser dito sobre (), na verdade.
precisa saber é o seguinte
4
No zsh, os caracteres que podem ser interpretados de forma diferente incluem []()^;, então eu acho que a resposta certa pode realmente ser [0-9a-zA-Z.,_-]vírgula também pode ser excluída apenas porque é estranho ver em um nome de arquivo, embora eu não possa pensar em um caso real em que isso poderia causar problemas
Casey Rodarmor
sim, removi-los a partir da lista final
naught101
11
vírgula pode ser irritante, tente echo whereami > a,b,cna janela do prompt de comando do Win10.
RedGrittyBrick
4

Você poderia:

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

Alt-1. caps iniciais podem substituir espaços: YYMMDD-HHMM-FileName.extouYYMMDD-HHMM_FileName.ext

Caracteres mínimos para uma exibição nítida, que classifica automaticamente com zeros acolchoados para janeiro-setembro (1º e 9º de agosto).

tb01
fonte