Quais caracteres são proibidos nos nomes de diretório do Windows e Linux?

356

Eu sei que / é ilegal no Linux, e o seguinte é ilegal no Windows (eu acho) * . " / \ [ ] : ; | ,

O que mais estou perdendo?

No entanto, preciso de um guia abrangente e que leve em consideração caracteres de byte duplo. Vincular a recursos externos está bem comigo.

Preciso primeiro criar um diretório no sistema de arquivos usando um nome que possa conter caracteres proibidos, por isso pretendo substituir esses caracteres por sublinhados. Preciso gravar esse diretório e seu conteúdo em um arquivo zip (usando Java), para que qualquer conselho adicional sobre os nomes dos diretórios zip seja apreciado.

Jeff
fonte
13
Alguns dos caracteres mencionados são permitidos no Windows. Verifique isto:echo abc > "ab.;,=[1]"
dolmen
3
Também não esqueça que <e> são ilegais no Windows.
AnotherParker 14/03
4
/ não é ilegal no Linux. Você apenas tem que escapar com um \ quando digitando-o.
David C. Bishop
5
@ DavidC.Bishop: Esta publicação do SO afirma que o kernel do Linux impedirá que você trabalhe com um nome de arquivo contendo uma barra. Você conseguiu fazê-lo funcionar?
Soren Bjornstad
14
"/ não é ilegal no Linux. Você só precisa escapar com um \ ao digitar" - esta afirmação está completamente errada. Os componentes do nome do arquivo não podem conter / e sua fuga não tem efeito.
Jim Balter

Respostas:

215

Um “guia abrangente” de caracteres proibidos de nome de arquivo não funcionará no Windows porque reserva nomes de arquivos e caracteres. Sim, caracteres como * " ?e outros são proibidos, mas há um número infinito de nomes compostos apenas por caracteres válidos que são proibidos. Por exemplo, espaços e pontos são caracteres válidos para o nome do arquivo, mas nomes compostos apenas por esses caracteres são proibidos.

O Windows não faz distinção entre caracteres maiúsculos e minúsculos; portanto, você não pode criar uma pasta chamada Ase uma ajá existir. Pior, nomes aparentemente permitidos como PRNe CON, e muitos outros, são reservados e não são permitidos. O Windows também possui várias restrições de comprimento; um nome de arquivo válido em uma pasta pode se tornar inválido se movido para outra pasta. As regras para nomear arquivos e pastas estão nos documentos da Microsoft.

Em geral, você não pode usar texto gerado pelo usuário para criar nomes de diretório do Windows. Se você quiser permitir que os usuários para citar qualquer coisa que eles querem, você tem que criar nomes seguros, como A, AB, A2et al., Armazenar nomes gerados pelo usuário e seus equivalentes de caminho em um arquivo de dados do aplicativo e executar o mapeamento caminho em sua aplicação.

Se você absolutamente deve permitir nomes de pastas gerados pelo usuário, a única maneira de saber se eles são inválidos é capturar exceções e assumir que o nome é inválido. Mesmo isso é repleto de perigos, já que as exceções lançadas para acesso negado, unidades offline e espaço fora da unidade se sobrepõem àquelas que podem ser lançadas para nomes inválidos. Você está abrindo uma enorme lata de mágoa.

Arco Alto de Dour
fonte
11
A frase-chave do link do MSDN é "[e] qualquer outro caractere que o sistema de arquivos de destino não permita". Pode haver diferentes sistemas de arquivos no Windows. Alguns podem permitir Unicode, outros não. Em geral, a única maneira segura de validar um nome é experimentá-lo no dispositivo de destino.
Adrian McCarthy
72
Existem algumas diretrizes e “há um número infinito de nomes compostos apenas por caracteres válidos que são proibidos” não é construtivo. Da mesma forma “Windows não faz distinção entre maiúsculas e caracteres minúsculos-” é uma exceção tolo - o OP é perguntando sobre sintaxe e não semântica, e há pessoas certas-minded diria que um nome de arquivo como A.txtera inválida porque a.TXTpodem existir.
Borodin
9
COPY CON PRNsignifica ler da entrada do teclado ou possível stdin e copiá-lo para o dispositivo da impressora. Não tenho certeza de que ainda é válido em janelas modernas, mas certamente foi por muito tempo. Antigamente, você poderia usá-lo para digitar texto e fazer com que uma impressora matricial simplesmente a produzisse.
AntonPiatek
6
"não é construtivo" - pelo contrário, é um fato. O que não é construtivo é a beligerância de Borodin.
Jim Balter
3
"Em geral, você não pode usar texto gerado pelo usuário para criar nomes de diretório do Windows." <- Se você quiser fazer isso, basta ter uma lista de desbloqueio de caracteres e ela funcionará amplamente, se você puder ignorar o problema já existente.
Casey #
533

Vamos simplificar e responder à pergunta primeiro.

  1. Os caracteres ASCII imprimíveis proibidos são:

    • Linux / Unix:

      / (forward slash)
      
    • Janelas:

      < (less than)
      > (greater than)
      : (colon - sometimes works, but is actually NTFS Alternate Data Streams)
      " (double quote)
      / (forward slash)
      \ (backslash)
      | (vertical bar or pipe)
      ? (question mark)
      * (asterisk)
      
  2. Caracteres não imprimíveis

    Se seus dados vierem de uma fonte que permitiria caracteres não imprimíveis, há mais a verificar.

    • Linux / Unix:

      0 (NULL byte)
      
    • Janelas:

      0-31 (ASCII control characters)
      

    Nota: Embora seja legal nos sistemas de arquivos Linux / Unix criar arquivos com caracteres de controle no nome do arquivo, pode ser um pesadelo para os usuários lidar com esses arquivos .

  3. Nomes de arquivos reservados

    Os seguintes nomes de arquivos são reservados:

    • Janelas:

      CON, PRN, AUX, NUL 
      COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
      LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
      

      (por conta própria e com extensões de arquivo arbitrárias, por exemplo LPT1.txt).

  4. Outras regras

    • Janelas:

      Os nomes de arquivos não podem terminar em um espaço ou ponto.

Christopher Oezbek
fonte
5
A maioria dos sistemas de arquivos do Windows não está restrita a caracteres de 8 bits. Existem muitos outros caracteres de 8 bits (NUL, caracteres de controle) que são proibidos no Windows. Mesmo considerando isso, não permitirá que o interlocutor "crie um diretório no sistema de arquivos", como ele pediu, porque há um número infinito de nomes de diretório inválidos compostos por caracteres não proibidos.
Dour High Arch
38
Outros já disseram isso e não é construtivo. Quando cheguei aqui, procurando uma resposta, queria a lista que tinha que reunir em outro lugar: Quais caracteres filtrar da entrada do usuário ao criar uma boa tentativa de um nome de arquivo válido. A questão de se os personagens se tornarem inválidos também pode precisar de alguma elaboração.
Christopher Oezbek
5
Um caractere NULL também é proibido no Linux.
Dan Jones
3
Novas linhas não são proibidas no Linux. Eu diria que eles deveriam ser, no entanto ... e se o NUL for banido no Linux, no Windows, ele terá o mesmo objetivo.
Alcaro
11
@Saku: é claro que não, já que o mundo não está girando em torno da Microsoft. Por que adicionar restrições desnecessárias quando há apenas dois caracteres que são absolutamente necessários para proibir?
Firegurafiku
67

No Linux e outros sistemas relacionados ao Unix, existem apenas dois caracteres que não podem aparecer no nome de um arquivo ou diretório, e esses são NUL '\0'e barra '/'. A barra, é claro, pode aparecer no nome de um caminho, separando os componentes do diretório.

Rumor 1 diz que Steven Bourne (de 'shell' fama) teve um diretório contendo 254 arquivos, um para cada letra (código de caracteres) que pode aparecer em um nome de arquivo (excluindo /, '\0'; o nome .era o diretório atual, é claro ) Foi usado para testar o shell Bourne e causar estragos rotineiramente em programas incautos, como programas de backup.

Outras pessoas cobriram as regras do Windows.

Observe que o MacOS X possui um sistema de arquivos que não diferencia maiúsculas de minúsculas.


1 Foi Kernighan & Pike em The Practice of Programming quem disse o mesmo no capítulo 6, testes, §6.5 testes de estresse:

Quando Steve Bourne estava escrevendo seu shell Unix (que ficou conhecido como shell Bourne), ele criou um diretório de 254 arquivos com nomes de um caractere, um para cada valor de byte, exceto '\0'e barra, os dois caracteres que não podem aparecer no Unix nomes de arquivo. Ele usou esse diretório para todos os tipos de testes de correspondência de padrões e tokenização. (É claro que o diretório de teste foi criado por um programa.) Por anos depois, esse diretório foi banido de programas que andam em árvores de arquivos; testou-os à destruição.

Observe que o diretório deve ter entradas .e .., portanto, eram 253 arquivos (e 2 diretórios) ou 255 entradas de nome, em vez de 254 arquivos. Isso não afeta a eficácia da anedota ou o teste cuidadoso que ela descreve.

Jonathan Leffler
fonte
11
254 arquivos? E o utf8?
precisa saber é o seguinte
20
Os 254 arquivos eram todos os nomes de arquivo com um único caractere, um por caractere permitido em um nome de arquivo. UTF-8 não era nem um brilho nos olhos quando Steve Bourne escreveu a concha Bourne. UTF-8 impõe regras sobre as seqüências válidas de bytes (e não permite os bytes 0xC0, 0xC1, 0xF5-0xFF). Caso contrário, não é muito diferente - no nível de detalhe que estou discutindo.
Jonathan Leffler
11
O separador de diretório em disco para sistemas de arquivos MacOS HFS + é na verdade um ':' em vez de um '/'. O SO geralmente (provavelmente sempre) faz a coisa certa quando você está trabalhando com APIs * nix. Mas não espere que isso aconteça de maneira confiável se você estiver mudando para o mundo OSX, por exemplo, com o AppleScript. Parece que talvez as APIs do cacau usem o / e oculte o: também, mas tenho certeza de que as APIs antigas do Carbon não.
Dan Pritts
@DanPritts Criei um esquema de fontes / cores personalizado nas preferências do Xcode, nomeando-o com um /no nome. Isso causou alguns problemas, pois criou um novo diretório com o esquema.
Andreas
Observe que, se um diretório tiver dois pontos em seu nome, você não poderá adicioná-lo a uma PATHvariável Unix , porque dois pontos serão usados ​​como separador (ponto e vírgula no Windows). Portanto, os programas nesse diretório devem ser executados com um nome de caminho que especifique onde ele está (pode ser relativo ou absoluto) ou você deve estar no diretório e ter dot ( ., o diretório atual) em PATH, o que é amplamente considerado como um inseguro.
Jonathan Leffler
36

Em vez de criar uma lista negra de caracteres, você pode usar uma lista de permissões . Considerando tudo, o intervalo de caracteres que faz sentido em um contexto de nome de arquivo ou diretório é bastante curto e, a menos que você tenha alguns requisitos de nomenclatura muito específicos, seus usuários não o manterão contra o aplicativo se eles não puderem usar toda a tabela ASCII.

Ele não resolve o problema de nomes reservados no sistema de arquivos de destino, mas com uma lista de permissões é mais fácil mitigar os riscos na origem.

Nesse espírito, este é um conjunto de caracteres que podem ser considerados seguros:

  • Letras (az AZ) - caracteres Unicode também, se necessário
  • Dígitos (0-9)
  • Sublinhado (_)
  • Hífen (-)
  • Espaço
  • Ponto (.)

E quaisquer caracteres seguros adicionais que você deseja permitir. Além disso, você apenas precisa aplicar algumas regras adicionais sobre espaços e pontos . Isso geralmente é suficiente:

  • O nome deve conter pelo menos uma letra ou número (para evitar apenas pontos / espaços)
  • O nome deve começar com uma letra ou número (para evitar pontos / espaços iniciais)
  • O nome pode não terminar com um ponto ou espaço (basta apará-los, se houver, como o Explorer)

Isso já permite nomes bastante complexos e sem sentido. Por exemplo, esses nomes seriam possíveis com essas regras e seriam nomes de arquivo válidos no Windows / Linux:

  • A...........ext
  • B -.- .ext

Em essência, mesmo com tão poucos caracteres na lista de permissões, você ainda deve decidir o que realmente faz sentido e validar / ajustar o nome de acordo. Em um dos meus aplicativos, usei as mesmas regras acima, mas retirei pontos e espaços duplicados.

AeonOfTime
fonte
15
E os meus usuários que não falam inglês, que todos se ferrariam com isso?
Pkh
2
@ pkh: Como mencionei no meu post, você incluiria todos os caracteres unicode necessários em sua lista de permissões. Intervalos de caracteres geralmente podem ser especificados com bastante facilidade, especialmente se você usar expressões regulares, por exemplo.
AeonOfTime 18/05/19
2
Utilizamos uma abordagem de lista de permissões, mas não esqueça que no Windows você precisa gerenciar cadeias reservadas e independentes de maiúsculas e minúsculas, como nomes de dispositivos (prn, lpt1, con) e. e ..
tahoar 12/10
2
Você perdeu a restrição do Windows: não deve terminar em ponto ou espaço.
Martin Bonner apoia Monica
11
"Considerando tudo, o intervalo de caracteres que faz sentido em um contexto de nome de arquivo ou diretório é bastante curto." Talvez para alguns casos de uso. Estou trabalhando em um projeto que agora envolve arquivos de mídia em 20 idiomas e os nomes de arquivos precisam refletir o título do item de mídia, porque os usuários finais encontrarão o conteúdo dessa maneira. Muitos dos nomes usam pontuação. Qualquer restrição nos caracteres do nome do arquivo tem um preço, portanto, neste caso, temos que minimizar as restrições. Nesse caso de uso, o intervalo de caracteres que não faz sentido em um nome de arquivo é muito menor e mais simples do que aqueles que fazem.
Larsh
29

A maneira mais fácil de obter o Windows para lhe responder é tentar renomear um arquivo via Explorer e digitar / para o novo nome. O Windows exibirá uma caixa de mensagem informando a lista de caracteres ilegais.

A filename cannot contain any of the following characters:
    \ / : * ? " < > | 

https://support.microsoft.com/en-us/kb/177506

chrisjej
fonte
28

Bem, mesmo que seja apenas para fins de pesquisa, sua melhor aposta é olhar para esta entrada da Wikipedia em Nomes de arquivos .

Se você deseja escrever uma função portátil para validar a entrada do usuário e criar nomes de arquivos com base nisso, a resposta curta é não . Dê uma olhada em um módulo portátil como o Perl's File :: Spec para dar uma olhada em todos os saltos necessários para realizar uma tarefa "simples".

Leonardo Herrera
fonte
5

Para Windows, você pode verificá-lo usando o PowerShell

$PathInvalidChars = [System.IO.Path]::GetInvalidPathChars() #36 chars

Para exibir códigos UTF-8, você pode converter

$enc = [system.Text.Encoding]::UTF8
$PathInvalidChars | foreach { $enc.GetBytes($_) }

$FileNameInvalidChars = [System.IO.Path]::GetInvalidFileNameChars() #41 chars

$FileOnlyInvalidChars = @(':', '*', '?', '\', '/') #5 chars - as a difference
Wojciech Sciesinski
fonte
Para quem não fala PowershelI, $ FileNameInvalidChars é de 0x00 a 0x1F e: "<> | *? \ /
Robin Davies
4

No Windows 10 (2019), os seguintes caracteres são proibidos por um erro ao tentar digitá-los:

Um nome de arquivo não pode conter nenhum dos seguintes caracteres:

\ / : * ? " < > |

Bret Cameron
fonte
3

Aqui está uma implementação de ac # para Windows com base na resposta de Christopher Oezbek

Foi tornado mais complexo pelo booleano containsFolder, mas espero que cubra tudo

/// <summary>
/// This will replace invalid chars with underscores, there are also some reserved words that it adds underscore to
/// </summary>
/// <remarks>
/// /programming/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names
/// </remarks>
/// <param name="containsFolder">Pass in true if filename represents a folder\file (passing true will allow slash)</param>
public static string EscapeFilename_Windows(string filename, bool containsFolder = false)
{
    StringBuilder builder = new StringBuilder(filename.Length + 12);

    int index = 0;

    // Allow colon if it's part of the drive letter
    if (containsFolder)
    {
        Match match = Regex.Match(filename, @"^\s*[A-Z]:\\", RegexOptions.IgnoreCase);
        if (match.Success)
        {
            builder.Append(match.Value);
            index = match.Length;
        }
    }

    // Character substitutions
    for (int cntr = index; cntr < filename.Length; cntr++)
    {
        char c = filename[cntr];

        switch (c)
        {
            case '\u0000':
            case '\u0001':
            case '\u0002':
            case '\u0003':
            case '\u0004':
            case '\u0005':
            case '\u0006':
            case '\u0007':
            case '\u0008':
            case '\u0009':
            case '\u000A':
            case '\u000B':
            case '\u000C':
            case '\u000D':
            case '\u000E':
            case '\u000F':
            case '\u0010':
            case '\u0011':
            case '\u0012':
            case '\u0013':
            case '\u0014':
            case '\u0015':
            case '\u0016':
            case '\u0017':
            case '\u0018':
            case '\u0019':
            case '\u001A':
            case '\u001B':
            case '\u001C':
            case '\u001D':
            case '\u001E':
            case '\u001F':

            case '<':
            case '>':
            case ':':
            case '"':
            case '/':
            case '|':
            case '?':
            case '*':
                builder.Append('_');
                break;

            case '\\':
                builder.Append(containsFolder ? c : '_');
                break;

            default:
                builder.Append(c);
                break;
        }
    }

    string built = builder.ToString();

    if (built == "")
    {
        return "_";
    }

    if (built.EndsWith(" ") || built.EndsWith("."))
    {
        built = built.Substring(0, built.Length - 1) + "_";
    }

    // These are reserved names, in either the folder or file name, but they are fine if following a dot
    // CON, PRN, AUX, NUL, COM0 .. COM9, LPT0 .. LPT9
    builder = new StringBuilder(built.Length + 12);
    index = 0;
    foreach (Match match in Regex.Matches(built, @"(^|\\)\s*(?<bad>CON|PRN|AUX|NUL|COM\d|LPT\d)\s*(\.|\\|$)", RegexOptions.IgnoreCase))
    {
        Group group = match.Groups["bad"];
        if (group.Index > index)
        {
            builder.Append(built.Substring(index, match.Index - index + 1));
        }

        builder.Append(group.Value);
        builder.Append("_");        // putting an underscore after this keyword is enough to make it acceptable

        index = group.Index + group.Length;
    }

    if (index == 0)
    {
        return built;
    }

    if (index < built.Length - 1)
    {
        builder.Append(built.Substring(index));
    }

    return builder.ToString();
}
Charlie Rix
fonte
Eu tenho três perguntas: 1. Por que você inicializou StringBuildercom o valor da capacidade inicial? 2. Por que você adicionou 12 ao comprimento da filename? 3. Os 12 foram escolhidos arbitrariamente ou houve alguma reflexão por trás desse número?
iiminov
2

Desde 18/04/2017, nenhuma lista simples de caracteres em preto e branco e nomes de arquivos é evidente entre as respostas a este tópico - e há muitas respostas.

A melhor sugestão que pude sugerir foi deixar o nome do usuário no arquivo da maneira que ele preferir. Usando um manipulador de erros quando o aplicativo tenta salvar o arquivo, capturar quaisquer exceções, assumir que o nome do arquivo é o culpado (obviamente depois de garantir que o caminho para salvar também esteja correto) e solicitar ao usuário um novo nome de arquivo. Para obter melhores resultados, coloque esse procedimento de verificação em um loop que continua até que o usuário acerte ou desista. Funcionou melhor para mim (pelo menos no VBA).

FCastro
fonte
11
Sua resposta @FCastro está correta do ponto de vista técnico. No entanto, da perspectiva do UX, é um pesadelo - o usuário é forçado a jogar o jogo "digite algo e eu direi se você for bem-sucedido" repetidas vezes. Prefiro ver uma mensagem (estilo de aviso) informando ao usuário que ele inseriu um caractere ilegal que será convertido posteriormente.
Mike
Christopher Oezbek forneceu uma lista negra em 2015.
Jim Balter
1

Embora os únicos caracteres ilegais do Unix possam ser /e NULL, embora algumas considerações para a interpretação da linha de comando devam ser incluídas.

Por exemplo, embora possa ser legal nomear um arquivo 1>&2ou 2>&1no Unix, nomes de arquivos como esse podem ser mal interpretados quando usados ​​em uma linha de comando.

Da mesma forma, pode ser possível nomear um arquivo $PATH, mas ao tentar acessá-lo na linha de comando, o shell será convertido $PATHem seu valor variável.

Dogg Bookins
fonte
para literais em bash, a melhor maneira que eu encontrei para declarar literais sem interpolação é $'myvalueis', ex: $ echo 'hi' > $'2>&1', cat 2\>\&1"oi"
ThorSummoner
1

Dificuldades em definir, o que é legal e o que não é foram abordadas e as listas de permissões foram sugeridas . Mas o Windows suporta caracteres com mais de 8 bits . A Wikipedia afirma que (por exemplo) o

letra do modificador dois pontos [( Consulte 7. abaixo )] às vezes é usado nos nomes de arquivos do Windows, pois é idêntico aos dois pontos na fonte Segoe UI usada para nomes de arquivos. O cólon [ASCII herdado] em si não é permitido.

Portanto, quero apresentar uma abordagem muito mais liberal usando caracteres Unicode para substituir os "ilegais". Eu achei o resultado no meu caso de uso comparável muito mais legível. Procure por exemplo neste bloco . Além disso, você pode até restaurar o conteúdo original a partir disso. As possíveis escolhas e pesquisas são fornecidas na seguinte lista:

  1. Em vez de *( U+002A * ASTERISK), você pode usar um dos muitos listados, por exemplo, U+2217 ∗ (ASTERISK OPERATOR)ou oFull Width Asterisk U+FF0A *
  2. Em vez de ., você pode usar um desses , por exemplo⋅ U+22C5 dot operator
  3. Em vez de ", você pode usar “ U+201C english leftdoublequotemark(Alternativas, veja aqui )
  4. Em vez de /( / SOLIDUS U+002F), você pode usar ∕ DIVISION SLASH U+2215(outros aqui )
  5. Em vez de \( \ U+005C Reverse solidus), você pode usar ⧵ U+29F5 Reverse solidus operator( mais )
  6. Em vez de [( U+005B Left square bracket) e ]( U+005D Right square bracket), você pode usar por exemplo U+FF3B[ FULLWIDTH LEFT SQUARE BRACKETe U+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET( daqui , mais possibilidades aqui )
  7. Em vez de :, você pode usar U+2236 ∶ RATIO (for mathematical usage)ou U+A789 ꞉ MODIFIER LETTER COLON, (consulte dois pontos (letra) , às vezes usado nos nomes de arquivos do Windows, pois é idêntico aos dois pontos na fonte da interface do usuário do Segoe usada para nomes de arquivos. Os dois pontos em si não são permitidos) (consulte aqui )
  8. Em vez de ;, você pode usar U+037E ; GREEK QUESTION MARK(veja aqui )
  9. Para |, existem alguns bons substitutos, tais como: U+0964 । DEVANAGARI DANDA, U+2223 ∣ DIVIDESou U+01C0 ǀ LATIN LETTER DENTAL CLICK( Wikipedia ). Além disso, os caracteres de desenho da caixa contêm várias outras opções.
  10. Em vez de ,( , U+002C COMMA), você pode usar, por exemplo ‚ U+201A SINGLE LOW-9 QUOTATION MARK(veja aqui )
  11. Para ?( U+003F ? QUESTION MARK), estes são bons candidatos: U+FF1F ? FULLWIDTH QUESTION MARKou U+FE56 ﹖ SMALL QUESTION MARK(de ele voltar , mais dois de Símbolos Bloquear , procure por "pergunta")
Cadoiz
fonte
0

Ao criar atalhos da Internet no Windows, para criar o nome do arquivo, ele ignora caracteres ilegais, exceto a barra, que é convertida em menos.

Matthias Ronge
fonte
3
"nenhuma resposta ... recusou - um moderador analisou sua bandeira, mas não encontrou evidências para apoiá-la". Só podes estar a brincar comigo. Melhores moderadores, por favor.
Jim Balter
-1

Nos shells do Unix, você pode citar quase todos os caracteres entre aspas simples '. Exceto as aspas simples, e você não pode expressar caracteres de controle, porque \não é expandido. É possível acessar a própria aspas simples a partir de uma sequência entre aspas, pois é possível concatenar as seqüências com aspas simples e duplas, como as 'I'"'"'m'que podem ser usadas para acessar um arquivo chamado "I'm"(aspas duplas também é possível aqui).

Portanto, você deve evitar todos os caracteres de controle, porque eles são muito difíceis de entrar no shell. O restante ainda é engraçado, especialmente arquivos começando com um traço, porque a maioria dos comandos os lê como opções, a menos que você tenha dois traços --antes ou especifique-os com ./, o que também oculta a partida -.

Se você quer ser legal, não use nenhum dos caracteres que o shell e os comandos típicos usam como elementos sintáticos, às vezes dependentes da posição, por exemplo, você ainda pode usar -, mas não como primeiro caractere; Da mesma forma ., você pode usá-lo como primeiro caractere apenas quando quiser ("arquivo oculto"). Quando você é malvado, seus nomes de arquivo são sequências de escape do VT100 ;-), de modo que ls detecta a saída.

quarto42
fonte
A questão não é sobre conchas.
Jim Balter
-8

Eu tinha a mesma necessidade e estava procurando recomendações ou referências padrão e me deparei com esse segmento. Minha lista negra atual de caracteres que devem ser evitados nos nomes de arquivos e diretórios são:

$CharactersInvalidForFileName = {
    "pound" -> "#",
    "left angle bracket" -> "<",
    "dollar sign" -> "$",
    "plus sign" -> "+",
    "percent" -> "%",
    "right angle bracket" -> ">",
    "exclamation point" -> "!",
    "backtick" -> "`",
    "ampersand" -> "&",
    "asterisk" -> "*",
    "single quotes" -> "“",
    "pipe" -> "|",
    "left bracket" -> "{",
    "question mark" -> "?",
    "double quotes" -> "”",
    "equal sign" -> "=",
    "right bracket" -> "}",
    "forward slash" -> "/",
    "colon" -> ":",
    "back slash" -> "\\",
    "lank spaces" -> "b",
    "at sign" -> "@"
};
Meng Lu
fonte
4
você se importaria de comentar em ter @na lista?
PypeBros
8
A questão era quais personagens são ilegais. A maioria dos personagens da sua lista é legal.
Nigel Alderton
6
a carta b? lol, eu suponho que é o b de lank spaces... bem, isso ainda deixa um pouco ... Eu renomeado uma imagem (),-.;[]^_~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpg, mas teve de mudar-lo de volta porque parecia com raiva ...
ashleedawg