Est-il correct d'utiliser certains caractères spéciaux pour nommer les noms de fichiers sous Linux?

18

Est - il exact d'utiliser certains caractères spéciaux, comme +, &, ', .(point) et ,(virgule), essentiellement, dans les noms de fichiers.

Je comprends que vous pouvez utiliser -et _sans problème, mais en faisant des recherches, je n'ai pas pu trouver quelque chose de précis sur les autres symboles; certains disent que vous pouvez, certains disent que vous ne pouvez pas, et d'autres disent qu'il n'est "pas encouragé" de les utiliser (quoi que cela signifie).

Chris Klein
la source
Quels programmes utilisez-vous pour travailler avec ces fichiers. Seuls les programmes qui interprètent certains caractères d'une manière spéciale (par exemple des shells sur des chaînes non cotées) poseront des problèmes. Votre programme C moyen prend tout ce qui n'est pas NUL sans cligner des yeux.
Anthon
9
Qu'entendez-vous par «correct»?
David Richerby
Le problème avec l'utilisation de caractères spéciaux dans un nom de fichier est que cela augmente les chances qu'un morceau de code bogué puisse mal gérer le nom de fichier. Cependant, je ne pense pas que l'un des personnages que vous avez énumérés soit particulièrement susceptible de causer un problème. Vous auriez plus de problèmes avec les espaces, ce qui devrait généralement être évité . Et l'EOL, en particulier, doit être évité à tout prix.
Windows a des restrictions plus strictes sur ce qui peut être dans un nom de fichier, donc s'il y a une chance que les fichiers doivent être utilisés là-bas, c'est quelque chose à faire attention.
evilsoup

Réponses:

28

Est-il correct d'utiliser certains caractères spéciaux, comme +, &, ',. (point) et, (virgule), essentiellement, dans les noms de fichiers.

Oui.

Correct mais pas nécessairement recommandé ou pratique.

Vous pouvez utiliser n'importe quel caractère à l'exception de null et/ dans un nom de fichier dans les systèmes de fichiers Unix et Linux modernes.

Vous pouvez utiliser la ponctuation ASCII . Certains utilitaires utilisent des arrêts ( point ) et des virgules dans les noms des fichiers qu'ils créent.

Vous pouvez utiliser des caractères de contrôle ASCII , mais cela est déconseillé car ils sont peu susceptibles d'être affichés de manière acceptable et sont difficiles à utiliser.

Vous pouvez utiliser des métacaractères shell tels que l'esperluette ASCII et l'apostrophe ASCII. Cependant, cela n'est pas pratique et nécessite que lors de la construction de commandes, vous fassiez particulièrement attention à citer ou à échapper de tels caractères.

Vous pouvez utiliser des caractères multi-octets à l' aide d'une variété d'encodages. Il appartient au shell et / ou aux utilitaires d'interpréter et d'afficher correctement les caractères non ASCII. Il est conseillé de vous limiter à un encodage populaire tel que UTF-8 et de définir les paramètres régionaux de manière appropriée.

Vous aurez le moins de problèmes à utiliser des caractères imprimables ASCII, limitant le jeu de caractères de ponctuation à ceux qui ne sont pas des méta-caractères shell et ne commençant pas un nom par un trait d'union (ou un arrêt - sauf si vous souhaitez masquer le fichier).

RedGrittyBrick
la source
23

Comme les autres l'ont indiqué, sur les systèmes Unix / Linux modernes, les noms de fichiers peuvent contenir n'importe quel caractère à l'exception de \0(NUL) et /(barre oblique).

En plus de cela, la norme POSIX définit un jeu de caractères portable pour les noms de fichiers:

3.278 Jeu de caractères de nom de fichier portable

Ensemble de caractères à partir duquel les noms de fichiers portables sont construits.

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 . _ -

Les trois derniers caractères sont les caractères <period>, <underscore> et <hyphen>, respectivement. Voir aussi Pathname .

L' pathchkutilitaire de GNU Coreutils vérifie cela lorsqu'il est appelé avec l' -poption, et l' -Poption avertira des noms de fichiers vides (qui ne sont pas valides mais peuvent être passés en argument pathchk) et des noms de fichiers commençant par un trait d'union ( -).

nyuszika7h
la source
9

Le pari le plus sûr est de se référer à l'entrée wikipedia pour le jeu de caractères autorisé pour tout système d'exploitation. Il peut être trouvé à partir d' ici .

Par exemple, pour la plupart des systèmes basés sur Unix, le jeu de caractères autorisé est un jeu de 8 bits et le caractère réservé est le caractère nul (NUL, '\0'). Cependant, ce n'est pas une bonne pratique d'utiliser les caractères spéciaux dans les noms de fichiers car ils posent un problème lors de leur suppression.

Par exemple, je peux avoir un nom de fichier comme -ramesh.txtet j'essaye de le supprimer comme ci-dessous.

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.

J'ai besoin de supprimer le fichier car,

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

Vous trouverez également plus de détails sur cette réponse .

Sous Linux et OS-X, seul /l'ensemble ASCII imprimable est interdit, je crois. Certains caractères (comme les métacaractères shell *?!) causeront des problèmes dans les lignes de commande et nécessiteront que le nom de fichier soit correctement cité ou échappé.

Les systèmes de fichiers Linux tels que ext2, ext3 sont indépendants des jeux de caractères (je pense qu'ils le traitent plus ou moins comme un flux d'octets - uniquement des valeurs nulles et /sont interdits). Cela signifie que vous pouvez stocker les noms de fichiers dans le codage UTF-8. Je crois qu'il appartient au shell ou à une autre application de savoir quel encodage utiliser pour convertir correctement le nom de fichier à afficher ou à traiter.

Donc, pour conclure, le problème n'est pas d'utiliser les caractères spéciaux pour les noms de fichiers mais de savoir comment les gérer.

Ramesh
la source
Pour cette raison ("comment les gérer"), j'utilise presque exclusivement des lettres, des chiffres, des traits de soulignement et des points, ne serait-ce que pour me faciliter la vie lorsque je déciderai plus tard que je dois utiliser des programmes en ligne de commande pour faire des choses dans mes fichiers (qui semble toujours revenir au moins une fois).
phyrfox
19
Ne pas préconiser les noms de fichiers commençant par -mais juste pour être précis: 1) vous n'avez certainement pas besoin des guillemets autour de ce nom de fichier, 2) au lieu d'utiliser l' --argument spécial , vous pouvez faire exactement ce que rmsuggère lui-même:, rm ./-ramesh.txtdonc vous n'avez pas besoin de le faire exactement comme vous le suggérez.
Michał Politowski
@ MichałPolitowski Non seulement vous n'avez pas besoin des guillemets, ils ont un effet exactement nul.
ctrl-alt-delor
4

Votre recherche a presque raison. Il est possible d'utiliser des caractères spéciaux dans les noms de fichiers, mais ce n'est pas conseillé car ces caractères ont une signification particulière. Les conventions de dénomination des fichiers sous Linux décrivent également d'autres restrictions sur les noms de fichiers, telles que «Les noms de fichiers ne doivent jamais commencer par un trait d'union».

Exemple simple d'exécution d'opérations en ligne de commande avec des caractères spéciaux dans les noms de fichiers.

À titre personnel, je préfère éviter les caractères spéciaux dans les noms de fichiers car ils nécessitent une attention particulière lorsque ces fichiers sont utilisés pour tout traitement. Ainsi, supprimant le souci de traiter les caractères spéciaux du processus de développement.

Simplement moi
la source
1
Donc, votre conseil serait d'utiliser uniquement -, _et .(point) dans les noms de fichiers?
Chris Klein
@ChrisKlein, oui, mais pas au début du nom de fichier.
Simply_Me
Une signification particulière est dans le programme (par exemple votre shell), pas le nom de fichier. Presque tous les programmes sur U & L ne se soucient pas de caractères du tout aussi longtemps qu'il n'y a pas un NUL dans le nom de fichier.
Anthon
@Anthon, oui, mon shell comme décrit dans le lien.
Simply_Me
2
À titre personnel, je recommanderais aux développeurs de nommer le dossier parent de leur projet quelque chose comme "föλder \ t☃" - afin qu'ils remarquent immédiatement s'ils font un bogue qui se casse sur ces noms de fichiers, au lieu de publier du code cassé ou des binaires que les autres doivent contourner. Son utilisation n'est pas un problème, tant que c'est le seul qui commence par «f», la tabulation dans n'importe quel shell entrera dans les choses difficiles à taper.
Peteris