Sous Linux et d'autres systèmes liés à Unix, il n'y a que deux caractères qui ne peuvent pas apparaître dans le nom d'un fichier ou d'un répertoire, et ce sont les suivants : NUL '\0'
et la barre oblique '/'
. La barre oblique, bien sûr, peut apparaître dans un nom de chemin, pour séparer les composants du répertoire.
Rumeur 1 On raconte que Steven Bourne (le célèbre "shell") avait un répertoire contenant 254 fichiers, un pour chaque lettre (code de caractères) pouvant apparaître dans un nom de fichier (à l'exclusion de /
, '\0'
; le nom .
était le répertoire courant, bien sûr). Il était utilisé pour tester le Bourne shell et faisait régulièrement des ravages sur des programmes imprudents comme les programmes de sauvegarde.
Autre personnes ont abordé les règles relatives aux noms de fichiers Windows, avec des liens vers les sites suivants Microsoft y Wikipedia sur le sujet.
Notez que MacOS X possède un système de fichiers insensible à la casse. Les versions actuelles de ce système semblent autoriser les deux-points :
dans les noms de fichiers, bien qu'historiquement, ce n'était pas toujours le cas :
$ echo a:b > a:b
$ ls -l a:b
-rw-r--r-- 1 jonathanleffler staff 4 Nov 12 07:38 a:b
$
POSIX définit un Jeu de caractères pour les noms de fichiers portables composé de :
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 . _ -
Le fait de s'en tenir à des noms formés uniquement à partir de ces caractères évite la plupart des problèmes, bien que Windows ajoute encore quelques complications.
1 C'est Kernighan & Pike dans ['The Practice of Programming'] (http://www.cs.princeton.edu/~bwk/tpop.webpage/) qui l'ont dit dans le chapitre 6, Tests, §6.5 Stress Tests :
Lorsque Steve Bourne a écrit son interpréteur de commandes Unix (connu sous le nom d'interpréteur de commandes Bourne), il a créé un répertoire de 254 fichiers portant des noms à un caractère, un pour chaque valeur d'octet, à l'exception des fichiers suivants '\0'
et slash, les deux caractères qui ne peuvent pas apparaître dans les noms de fichiers Unix. Il a utilisé ce répertoire pour toutes sortes de tests de reconnaissance de motifs et de tokenisation. (Le répertoire de test était bien sûr créé par un programme). Pendant des années, ce répertoire a été le fléau des programmes de recherche d'arbres de fichiers ; il les testait jusqu'à la destruction.
Notez que le répertoire doit avoir contenu des entrées .
y ..
Il s'agissait donc de 253 fichiers (et 2 répertoires), ou de 255 entrées de noms, plutôt que de 254 fichiers. Cela n'affecte pas l'efficacité de l'anecdote, ni les tests minutieux qu'elle décrit.
_TPOP était auparavant à http://plan9.bell-labs.com/cm/cs/tpop et http://cm.bell-labs.com/cm/cs/tpop mais les deux sont maintenant (2021-11-12) cassés. Voir aussi Wikipedia sur TPOP ._
23 votes
Certains des caractères que vous mentionnez sont en fait autorisés sous Windows. Vérifiez ceci :
echo abc > "ab.;,=[1]"
0 votes
Vous pouvez utiliser encodeURIComponent (Javascript) ou un équivalent.
8 votes
N'oubliez pas non plus que < et > sont illégaux sous Windows.
2 votes
Ce n'est pas parce que l'API win32 passe que c'est autorisé. Lisez d'abord les spécifications NTFS et FAT32 avant de vous lancer dans le RCS et le CVS sous Windows.
5 votes
/ n'est pas illégal sous Linux. Vous devez simplement l'échapper avec un \ lorsque vous le tapez.
4 votes
^
est interdit sur FAT0 votes
J'utilise l'encodage base64 qui est assez sûr, on pourrait probablement aussi utiliser l'encodage urlencoding pour une meilleure lecture sur le fs. mais oui, sous Windows, le problème de la casse subsiste toujours. vous pourriez utiliser l'encodage base32 pour être encore plus sûr, mais alors vous avez le problème des noms de fichiers longs. c'est un compromis
7 votes
@DavidC.Bishop : Ce post SO affirme que le noyau Linux vous empêchera de travailler avec un nom de fichier contenant un slash. Avez-vous réussi à le faire fonctionner ?
54 votes
"/" n'est pas illégal sous Linux. Vous devez juste l'échapper avec un \ lorsque vous le tapez " -- cette affirmation est complètement fausse. Les composants des noms de fichiers ne peuvent pas contenir /, et l'échapper n'a aucun effet.
5 votes
Je teste sur NTFS uniquement et je peux dire que . [ ] = : ; et , semblent fonctionner correctement. Je n'ai pas testé FAT32
1 votes
;
n'est pas illégal dans les noms de fichiers ou de dossiers sous Windows. Je l'utilise tout le temps comme pseudo-remplacement de:
. Ex : Je peux nommer un dossier dans Windowsstd;;string
pour documenter les informations sur std::string . Et à la place d'une double citation sur Windows ("
), je fais simplement deux guillemets simples côte à côte, ce qui semble assez proche :''
.0 votes
Une question légèrement différente est "qu'est-ce qu'un nom de répertoire ou un nom de fichier impossible à créer sous Linux" ? Essayer de créer un fichier/répertoire avec la chaîne vide comme nom de fichier échoue toujours. La chaîne vide peut être passée comme argument à un programme ou une fonction sous la forme ''. Je ne vois rien d'autre qui puisse être passé comme argument et qui ne puisse absolument pas être un nom de fichier. Même '//' et '/..' se résolvent simplement en '/' et sont donc des noms de répertoire légaux (lorsqu'ils sont utilisés dans le shell bash).
0 votes
Il y a une différence entre être interdit en tant que caractère de chemin d'accès (
" < > |
) et étant interdit en tant que caractère de nom de fichier (: * ? \ /
+ caractères du chemin)