É correto usar certos caracteres especiais ao nomear nomes de arquivos no Linux?

18

É correto usar determinados caracteres especiais, como +, &, ', .(ponto) e ,(vírgula), basicamente, em nomes de arquivos.

Entendo que você pode usar -e _sem problemas, mas, ao fazer algumas pesquisas, não consegui encontrar algo definitivo sobre os outros símbolos; alguns dizem que você pode, outros dizem que não, e outros dizem que "não é incentivado" a usá-los (o que isso significa).

Chris Klein
fonte
Quais programas você está usando para trabalhar com esses arquivos. Somente programas que interpretam alguns caracteres de uma maneira especial (por exemplo, conchas em cadeias não citadas) causam problemas. Seu programa C médio leva tudo o que não é NUL sem piscar um olho.
Anthon
9
O que você quer dizer com "correto"?
David Richerby
O problema com o uso de caracteres especiais em um nome de arquivo é que isso aumenta a chance de que algum trecho de código com erro manipule incorretamente o nome do arquivo. No entanto, não acho que nenhum dos personagens listados tenha probabilidade de causar qualquer problema. Você teria mais problemas com espaço em branco, o que geralmente deve ser evitado . EOL, especificamente, deve ser evitado a todo custo.
O Windows tem restrições mais rígidas sobre o que pode estar em um nome de arquivo, portanto, se houver alguma chance de que os arquivos precisem ser usados ​​lá, é algo a se prestar atenção.
evilsoup

Respostas:

28

É correto usar certos caracteres especiais, como +, &, ',. (ponto) e (vírgula), basicamente, nos nomes dos arquivos.

Sim.

Correto, mas não necessariamente aconselhável ou conveniente.

Você pode usar qualquer caractere, exceto nulo e/ dentro de um nome de arquivo nos modernos sistemas de arquivos Unix e Linux.

Você pode usar pontuação ASCII . Alguns utilitários usam paradas ( ponto ) e vírgulas nos nomes dos arquivos que eles criam.

Você pode usar caracteres de controle ASCII , no entanto, isso é desaconselhável, pois é improvável que sejam exibidos de forma aceitável e difícil de usar.

Você pode usar metacaracteres de shell , como e comercial ASCII e apóstrofo ASCII. No entanto, isso é inconveniente e requer que, ao construir comandos, você tenha especial cuidado para citar ou escapar desses caracteres.

Você pode usar caracteres de vários bytes usando uma variedade de codificações. Cabe ao shell e / ou utilitários interpretar e exibir corretamente caracteres não ASCII. É aconselhável restringir-se a uma codificação popular como UTF-8 e definir o código do idioma adequadamente.

Você terá menos problemas ao usar caracteres imprimíveis ASCII, limitando o conjunto de caracteres de pontuação a caracteres que não sejam metacaracteres do shell e não inicie um nome com um hífen (ou uma parada - a menos que você queira ocultar o arquivo).

RedGrittyBrick
fonte
23

Como os outros declararam, nos sistemas modernos Unix / Linux, os nomes de arquivos podem conter qualquer caractere, exceto \0(NUL) e /(barra).

Além disso, o padrão POSIX define um conjunto de caracteres portátil para nomes de arquivos:

3.278 Conjunto de caracteres de nome de arquivo portátil

O conjunto de caracteres dos quais os nomes de arquivos portáteis são construídos.

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _ -

Os últimos três caracteres são <period>, <underscore> e <hyphen>, respectivamente. Veja também Pathname .

O pathchkutilitário do GNU Coreutils verifica isso quando chamado com a -popção, e a -Popção avisa sobre nomes de arquivos vazios (que não são válidos, mas podem ser passados ​​como argumento para pathchk) e nomes de arquivos começando com um hífen ( -).

nyuszika7h
fonte
9

A aposta mais segura é consultar a entrada da Wikipedia para o conjunto de caracteres permitido para qualquer sistema operacional. Pode ser encontrado aqui .

Por exemplo, para a maioria dos sistemas baseados em unix, o conjunto de caracteres permitido é um conjunto de 8 bits e o caractere reservado é o caractere nulo (NUL, '\0'). No entanto, não é uma boa prática usar os caracteres especiais nos nomes dos arquivos, pois eles apresentam um problema ao removê-los.

Por exemplo, posso ter um nome de arquivo como -ramesh.txte tento removê-lo como abaixo.

rm -ramesh.txt
rm: invalid option -- 'a'
Try `rm ./-ramesh.txt' to remove the file `-ramesh.txt'.
Try `rm --help' for more information.
rm "-ramesh.txt"
rm: invalid option -- 'a'
Try `rm ./-ramesh.txt' to remove the file `-ramesh.txt'.
Try `rm --help' for more information.

Eu preciso excluir o arquivo como,

rm -- "-ramesh.txt"
rm: remove regular empty file `-ramesh.txt'? y

Mais detalhes podem ser encontrados nesta resposta também .

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.

Portanto, para concluir, o problema não está em usar caracteres especiais para nomes de arquivos, mas em como lidar com eles.

Ramesh
fonte
Por esse motivo ("como lidar com eles"), uso quase exclusivamente apenas letras, números, sublinhados e pontos, apenas para facilitar minha vida quando decidir mais tarde que preciso usar programas de linha de comando para fazer coisas com meus arquivos (que parece sempre aparecer pelo menos uma vez).
phyrfox
19
Para não advogar nomes de arquivos começando com, -mas apenas para ser preciso: 1) você definitivamente não precisa das aspas em torno deste nome de arquivo; 2) em vez de usar o --argumento especial, você pode fazer exatamente o que rmsugere: rm ./-ramesh.txtportanto, não precisa fazê-lo exatamente como você sugere.
Michał Politowski
@ MichałPolitowski Não apenas você não precisa das aspas, elas têm exatamente zero efeito.
Ctrl-alt-delor 20/09/14
4

Sua pesquisa está quase certa. É possível usar caracteres especiais nos nomes dos arquivos, mas não é aconselhável, pois esses caracteres têm um significado especial. As convenções de nomenclatura de arquivos no Linux descrevem outras restrições aos nomes dos arquivos, como "Os nomes dos arquivos nunca devem começar com um hífen".

Exemplo simples de execução de operações de linha de comando com caracteres especiais nos nomes dos arquivos.

Como observação pessoal, prefiro evitar caracteres especiais nos nomes dos arquivos, porque eles requerem atenção especial quando esses arquivos são usados ​​para qualquer processamento. Assim, removendo a preocupação de lidar com caracteres especiais do processo de desenvolvimento.

Simplesmente eu
fonte
11
Portanto, o seu aconselhar seria usar apenas -, _e .(DOT) em nomes de arquivos?
Chris Klein
@ ChrisKlein, sim, embora não no início do nome do arquivo.
Simply_Me
Um significado especial está no programa (por exemplo, seu shell), não no nome do arquivo. Quase todos os programas no L & L não se preocupam com personagens em tudo , desde que não há um NUL no nome do arquivo.
Anthon
@ Anthon, sim, meu shell como descrito no link.
Simply_Me
2
Como nota pessoal, eu recomendo que os desenvolvedores nomeiem a pasta pai do projeto como "föλder \ t☃" - para que notem imediatamente se cometerem um erro que quebra nesses nomes de arquivos, em vez de publicar códigos ou binários quebrados que outros têm que contornar. Usá-lo não é um problema, desde que seja o único que comece com 'f', o preenchimento de guias em qualquer shell entrará nas coisas difíceis de digitar.
Peteris 16/09