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

60

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

J'aimerais utiliser le YYYY-MM-DDformat de date, 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).

Martin Ueding
la source
… Sous Unix, Windows, un Amiga 1000?
Slhck
Principalement Linux moderne.
Martin Ueding
- symbole est sans danger pour utiliser sur Windows 7 .. peut être autre système d'exploitation moderne faire la même chose, vous pouvez utiliser le symbole moins pour séparer ..
Niranjan Singh
duplication possible sur plusieurs sites de: stackoverflow.com/questions/4814040/…
Ciro Santilli a annoncé le

Réponses:

48

Sommaire:

  • Windows: tout sauf les caractères de contrôle ASCII et \/:*?"<>|
  • Linux, OS-X: tout sauf null ou /

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

les fenêtres

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 ne respectent pas 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. Cependant, bien que l'invite de commande Windows répertorie volontiers les deux fichiers à l'aide dir, vous ne pouvez pas accéder facilement à l'un d'entre eux ni en manipuler à l'aide de commandes telles que type. Voir ci-dessous.

Linux, OS-X

Sous Linux et OS-X, seul /le jeu ASCII imprimable est interdit, je crois. Certains caractères (métacaractères du shell, par exemple *?!) poseront des problèmes de ligne de commande et obligeront le nom de fichier à être cité ou échappé de manière appropriée.

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 - uniquement les valeurs NULL et /sont interdites). Cela signifie que vous pouvez stocker les noms de fichiers au format UTF-8. Je pense qu'il appartient 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’était 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 deuxième fichier, la typecommande Windows renvoie simplement le contenu de Ab à la place. Le troisième fichier serait également distinct de aB sous Linux.

(Windows 10 NTFS).

RedGrittyBrick
la source
1
Dans l'ensemble, c'est une bonne réponse, mais je m'abstiendrais d'utiliser des noms de fichiers dans les espaces. Les échapper correctement dans tous les contextes est plus problématique que ça ne vaut la peine. Notez que Microsoft a cessé d'utiliser l'espace dans les noms de répertoire du système. Si vous devez indiquer des limites de mots dans les noms, CamelCase fonctionne correctement.
Isaac Rabinovitch
4
"C: \ Program files (x86)" existe toujours dans Win8 - n'est-ce pas un répertoire système? Je suis d'accord que les espaces peuvent causer des problèmes.
RedGrittyBrick
C’est vrai, mais on peut le renommer à peu près. Bien sûr, beaucoup de programmes vont paniquer si vous le renommez en "]: \ foobar", mais Windows y fait référence sous le nom "% programfiles (x86)%".
Marcks Thomas
2
Il convient de garder à l’esprit que les systèmes Linux sont en mesure de considérer les majuscules et les plus basses comme distinctes, tandis que Windows les considère comme identiques.
thecoshman
1
Vous seriez surpris de voir combien de programmes sont lamentables à l'analyse. C'est pourquoi il n'y avait pas de Windows 9.
Isaac Rabinovitch
46

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 l' octet nul pose problème sur au moins un système et doit toujours être évité.
  • Les espaces étant utilisés comme séparateurs d'arguments sur de nombreux systèmes, les noms de fichiers comportant des espaces doivent être évités autant que possible. D'autres espaces (ex. Tabulations) encore plus.
  • Les points-virgules (;) permettent de séparer les commandes sur de nombreux systèmes. Les points-virgules et les virgules (,) sont utilisés pour séparer les arguments de la ligne de commande sur (certaines versions de?) De la ligne de commande Windows.
  • []()^ #%&!@:+={}'~et [`] ont tous une signification particulière dans de nombreux coquillages et sont agaçants à travailler, il faut donc les éviter. Ils ont également tendance à avoir une apparence horrible dans les URL .
  • Principaux personnages à é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 point d’arrêt complet [.] comme caractère principal pour les fichiers et répertoires cachés.
  • Tout ce qui ne se trouve 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ûrs et non gênants à utiliser (tant que vous démarrez le nom de fichier avec un caractère alphanumérique) :)

rien101
la source
1
Les accolades ( []) font partie des expressions régulières et ont également une signification spéciale dans le shell. Mais ils ne sont pas si mauvais que de travailler avec, sauf quelques cas de mauvais coin.
Martin Ueding
1
Hmm ... Je pense qu'on pourrait en dire autant de la même chose ().
naught101
4
Dans zsh, les caractères qui pourraient être interprétés différemment incluent []()^;, donc je pense que la bonne réponse pourrait en fait être une [0-9a-zA-Z.,_-]virgule pourrait également être exclue simplement parce que c'est bizarre de voir un nom de fichier, bien que je ne puisse pas penser à un cas réel où cela causerait problèmes.
Casey Rodarmor
oui, je les ai retirés de la liste finale
naught101
1
la virgule peut être agaçante, essayez echo whereami > a,b,cdans la fenêtre d'invite de commande de Win10.
RedGrittyBrick
4

Vous pourriez:

  1. remplacer les traits de soulignement actuels par #(symbole du correcteur d'épreuves pour l'espace)
  2. trait de soulignement pour 'section' date depuis le nom du fichier (ou un deuxième trait d'union - plus facile à saisir)

Alt-1. les majuscules peuvent remplacer les espaces: YYMMDD-HHMM-FileName.extouYYMMDD-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).

tb01
la source