82 votes

Quels caractères sont sûrs dans les noms de fichiers multiplateformes pour Linux, Windows et OS-X ?

Actuellement, j'utilise un YYMMDD-NAME+PAGE pour la plupart de mes fichiers. NAME les espaces sont convertis en caractères de soulignement.

J'aimerais utiliser le YYYY-MM-DD format de date, mais je ne sais pas comment le séparer du nom. A - aurait l'air étrange si le nom commençait par un chiffre. Si j'utilise un _ alors il y a conflit avec le trait de soulignement qui représente un espace.

Quels sont les caractères raisonnablement sûrs dans les noms de fichiers qui pourraient fonctionner ici ? Je suis sous Linux, mais je pourrais partager des fichiers avec d'autres personnes (Windows 7, Mac OS X).

75voto

Steve Weigand Points 141

Si la réponse de RedGrittyBrick est techniquement correcte, la sécurité n'est pas la seule question : la convivialité est également importante. Je pense qu'une meilleure question est "quels caractères sont bons à utiliser dans un nom de fichier".

Quelques lignes directrices potentielles :

  • [0-9a-zA-Z_] - Les caractères alphanumériques et le trait de soulignement peuvent toujours être utilisés.
  • *`\/:?"<>|` y el octet nul** sont problématiques sur au moins un système, et devraient toujours être évités.
  • Espaces sont utilisés comme séparateurs d'arguments sur de nombreux systèmes, aussi les noms de fichiers comportant des espaces doivent-ils être évités autant que possible. Les autres espaces (par exemple les tabulations) le sont encore plus.
  • Point-virgule ( ;) sont utilisés pour séparer les commandes sur de nombreux systèmes. Points-virgules et virgules (,) sont utilisés pour séparer les arguments de la ligne de commande sur (certaines versions de ?) la ligne de commande Windows.
  • []()^ #%&!@:+={}'~ y [`] ont tous des significations spéciales dans de nombreux shells, et sont ennuyeux à contourner, et devraient donc être évités. Ils sont également ont tendance à avoir l'air horrible dans les URLs .
  • Personnages principaux à éviter :
    • De nombreux programmes de ligne de commande utilisent l'option trait d'union [-] pour indiquer des arguments spéciaux.
    • Les systèmes basés sur *nix utilisent un point final [.] comme caractère principal pour les fichiers et répertoires cachés.
  • Tout ce qui n'est pas dans le Jeu ASCII peut causer des problèmes sur des systèmes plus anciens ou plus basiques (par exemple, certains systèmes embarqués), et doit être utilisé avec précaution.

Cela vous laisse essentiellement avec :

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

qui sont toujours sûr et pas gênant à utiliser (tant que vous commencez le nom du fichier par un alpha-numérique) :)

62voto

RedGrittyBrick Points 78148

Résumé :

  • Windows : tout ce qui n'est pas des caractères de contrôle ASCII et \/:*?"<>|
  • Linux, OS-X : tout sauf null ou /

Sur toutes les plateformes, il est préférable d'éviter les caractères non imprimables tels que les caractères de contrôle ASCII.

Windows

Dans Windows, l'Explorateur Windows n'autorise pas les caractères de contrôle ou \/:*?"<>| Vous pouvez utiliser des espaces. Si vous utilisez des espaces, vous devrez souvent citer le nom du fichier lorsqu'il est utilisé à partir de la ligne de commande (mais les applications GUI ne sont pas affectées pour autant que je sache). Les systèmes de fichiers Windows tels que NTFS stockent apparemment l'encodage avec le nom de fichier, mais UTF-16 est la norme.

Certaines parties de Windows sont sensibles à la casse, d'autres non. Il est facile de créer des noms de fichiers distincts comme "Ab" et "ab" sur un système de fichiers NTFS de Windows. Ces noms font référence à des fichiers distincts qui contiennent des contenus distincts. Cependant, bien que l'invite de commande de Windows énumère volontiers les deux fichiers à l'aide de la commande dir vous ne pouvez pas facilement accéder ou manipuler l'un d'entre eux en utilisant des commandes telles que type . Voir ci-dessous.

Linux, OS-X

Sous Linux et OS-X seulement / du jeu ASCII imprimable est interdit je crois. Certains caractères (Shell tels que *?! ) posera des problèmes dans les lignes de commande et nécessitera que le nom de fichier soit correctement cité ou échappé.

Les systèmes de fichiers Linux tels que ext2, ext3 sont agnostiques quant au jeu de caractères (je pense qu'ils le traitent plus ou moins comme un flux d'octets - seuls les nuls et les / sont interdites). Cela signifie que vous pouvez stocker les noms de fichiers en encodage UTF-8. Je crois que c'est à l'application Shell ou autre de savoir quel encodage utiliser pour convertir correctement le nom de fichier pour l'affichage ou le traitement.

Conclusion

Vous pouvez donc probablement utiliser quelque chose comme (si ce n'était pas si difficile à taper)


La (in)sensibilité des cas dans Windows

C> dir /B
Ab
aB
B

C> type Ab
b
b

C> type aB
b
b

C> type B
unicode homograph

Notez que nous ne pouvons pas taper le contenu du second fichier, celui de Windows. type renvoie simplement le contenu de Ab à la place. Le troisième fichier serait distinct de aB sous Linux également.

(Windows 10 NTFS).

4voto

tb01 Points 41

Tu pourrais :

  1. remplacer les caractères de soulignement actuels par # (symbole du correcteur pour l'espace)
  2. trait de soulignement pour 'sectionner' la date du nom de fichier (ou un deuxième trait d'union - plus facile à taper)

Alt-1. Les majuscules initiales peuvent remplacer les espaces : YYMMDD-HHMM-FileName.ext o YYMMDD-HHMM_FileName.ext

Un nombre minimal de caractères pour un affichage clair, qui se trie automatiquement avec des zéros rembourrés de janvier à septembre (et du 1er au 9 de chaque mois).

2voto

Douglas Milnes Points 27

Les personnages ont été largement abordés par d'autres personnes, mais je vais souligner un aspect supplémentaire à prendre en compte. Tout d'abord, j'aborde le choix de l'AAMMJD, qui présente deux problèmes.

Le premier problème de l'AAMMJD est qu'il ne fonctionne pas pour les données historiques. Il triera 1997 longtemps après 2035, plutôt qu'avant. La question de savoir si c'est un problème dépend de l'ampleur de la propagation du format que vous souhaitez.

L'autre problème de l'AAMMJD est lié à l'utilisation du calendrier. Si le calendrier grégorien est aujourd'hui le plus populaire au monde, tout le monde ne l'utilise pas ou n'est pas conscient du jour auquel il se réfère. Heureusement, le calendrier grégorien année est généralement connue et acceptée, même par ceux qui utilisent des années différentes, mais la nomenclature mois/jour peut être dénuée de sens. Pour être plus portable, un format de AAAA-JJD où JJ est le jour de l'année, est plus portable. Cependant, pour ceux d'entre nous qui utilisent le calendrier grégorien que est difficile car nous ne connaissons généralement pas le jour de l'année. Le format MMDD reste triable, même s'il ne signifie rien pour un individu, qui pourrait lui-même créer une date comme 20221442 (année grégorienne et son mois et jour) ou 20220047 (16 février grégorien, le 47e jour de l'année), en pensant respecter votre format.

Pour poursuivre sur le thème de l'étendue de l'utilisation du format, il convient de prendre en considération les caractères disponibles dans le monde entier. Le tiret court '-' est disponible partout ( ?) car il s'agit du signe moins, utilisé dans le monde entier. Le soulignement est plus problématique, même pour ceux qui utilisent l'alphabet latin. Ils peuvent normalement l'obtenir d'une manière ou d'une autre, mais il n'est pas présent sur tous les claviers. Dans certains alphabets, l'underscore est un caractère ou un modificateur de caractère, ce qui crée une confusion. Dans de nombreuses langues persanes, le trait de soulignement serait lu comme un kasheeda. Dans de nombreux alphabets, ce pour quoi nous utilisons un trait de soulignement, ils l'utiliseraient comme un surlignement : quelque chose de difficile à obtenir sur nos claviers. La plupart des claviers destinés aux techniciens comportent l'alphabet latin simple (parfois sur le côté de la touche), ce qui leur permet de taper les lettres. Mais pas toujours le trait de soulignement.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X