web-dev-qa-db-fra.com

Quels caractères sont en sécurité dans les noms de fichiers multiplates-formes pour Linux, Windows et OS-X?

Actuellement, j'utilise un nom YYMMDD-NAME+PAGE pour la plupart de mes fichiers. NAME a des espaces convertis en traits de soulignement.

J'aimerais utiliser le format de date YYYY-MM-DD, mais je ne sais pas comment le séparer du nom. Un - semblerait étrange si le nom commençait par un nombre. Si j'utilise un _, alors il est en conflit avec le trait de soulignement représentant un espace.

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

54
Martin Ueding

Résumé:

  • Windows: tout sauf les caractères de contrôle ASCII et \/:*?"<>|
  • Linux, OS-X: n'importe quoi 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

Sous 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 de l'interface graphique ne sont pas affectées pour autant que je sache). Les systèmes de fichiers Windows tels que NTFS stockent apparemment le codage avec le nom de fichier, mais UTF-16 est standard.

Certaines parties de Windows sont sensibles à la casse, d'autres sont insensibles à la casse. Il est facile de créer des noms de fichiers distincts tels que "Ab" et "ab" sur un système de fichiers Windows NTFS. Ces noms font référence à des fichiers distincts contenant un contenu distinct. Toutefois, bien que l'invite de commandes Windows répertorie volontiers les deux fichiers à l'aide de dir, vous ne pouvez pas accéder facilement à l'un d'eux ni en manipuler à l'aide de commandes telles que type. Voir ci-dessous.

Linux, OS-X

Sous Linux et OS-X, seul le / du jeu imprimable ASCII est interdit, je crois. Certains caractères (métacaractères Shell comme *?!) poseront des problèmes de ligne de commande et nécessiteront que le nom du fichier soit correctement cité ou échappé.

Les systèmes de fichiers Linux tels que ext2, ext3 sont agnostiques en ce qui concerne les jeux de caractères (je pense qu'ils le traitent plus ou moins comme un flux d'octets - seules les valeurs nulles et / sont interdites). Cela signifie que vous pouvez stocker les noms de fichiers au format UTF-8. Je pense que c'est au Shell ou à une autre application de savoir quel codage utiliser pour convertir correctement le nom de fichier en affichage ou en traitement.

Conclusion

Donc, vous pouvez probablement utiliser en toute sécurité quelque chose comme (si ce n’est pas si difficile à taper)


Sensibilité à la casse (in) sous 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, la commande Windows type renvoie simplement le contenu de Ab à la place. Le troisième fichier serait également distinct de aB sous Linux.

(Windows 10 NTFS).

46
RedGrittyBrick

Bien que la réponse de RedGrittyBrick soit techniquement correcte, la sécurité n'est pas le seul problème: 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 conviennent toujours.
  • \/:*?"<>|et le octet nulposent problème sur au moins un système et doivent toujours être évités .
  • Les espacessont utilisés comme séparateurs d'arguments sur de nombreux systèmes. Par conséquent, les noms de fichiers comportant des espaces doivent être évités autant que possible. Les autres espaces (p. Ex. Les onglets) le sont encore plus.
  • Les points-virgules (;)sont utilisés pour séparer les commandes sur de nombreux systèmes. Les points-virgules et les virgules (,)permettent de séparer les arguments de la ligne de commande sur (certaines versions de?) de la ligne de commande de Windows.
  • []()^ #%&!@:+={}'~and [`]ont tous des significations spéciales dans de nombreux shells et sont gênants à contourner, et doivent donc être évités. Ils ont également tendance à avoir une apparence horrible dans les URL .
  • Caractères principauxà éviter:
    • De nombreux programmes en ligne de commande utilisent le trait d'union [-]pour indiquer des arguments spéciaux.
    • Les systèmes basés sur * nix utilisent un [.]comme caractère principal pour les fichiers et les répertoires cachés.
  • Tout ce qui ne se trouve pas dans le ensemble ASCIIpeut causer des problèmes sur des systèmes plus anciens ou plus basiques (par exemple, certains systèmes intégrés) , et doit être utilisé avec précaution.

Cela vous laisse essentiellement avec:

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

qui sont toujours sûrs et non gênants à utiliser (tant que vous démarrez le nom du fichier avec un caractère alphanumérique) :)

40
naught101

Vous pourriez:

  1. remplacer les traits de soulignement actuels par # (symbole d'espace libre pour le relecteur)
  2. trait de soulignement pour 'section' date du nom du fichier (ou un deuxième trait d'union - plus facile à taper)

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

Caractères minimaux pour un affichage clair, qui trie automatiquement avec des zéros remplis pour les mois de janvier à septembre (et du 1er au 9 de chaque mois).

4
tb01