166 votes

Est-il possible d'utiliser "/" dans un nom de fichier?

Je sais que ce n’est pas quelque chose qui devrait être fait, mais existe-t-il un moyen d’utiliser le caractère barre oblique qui sépare normalement les répertoires d’un nom de fichier sous Linux?

177voto

Robert Martin Points 5480

La réponse est que vous ne pouvez pas, à moins que votre système de fichiers a un bug. Voici pourquoi:

Il y a un système d'appel permettant de renommer votre fichier défini dans fs/namei.c appelés renameat:

SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
                int, newdfd, const char __user *, newname)

Lors de l'appel système est appelé, il fait un chemin de recherche (do_path_lookup) sur le nom. Garder le traçage de cela, et nous faisons link_path_walk cette:

static int link_path_walk(const char *name, struct nameidata *nd)
{
       struct path next;
       int err;
       unsigned int lookup_flags = nd->flags;

       while (*name=='/')
              name++;
       if (!*name)
              return 0;
...

Ce code s'applique à tout système de fichiers. Qu'est-ce que cela signifie? Cela signifie que si vous essayez de passer un paramètre avec un effectif '/' de caractères que le nom du fichier à l'aide de moyens traditionnels, il ne va pas faire ce que vous voulez. Il n'y a aucun moyen d'échapper le caractère. Si un système de fichiers "prend en charge" cela, c'est parce qu'ils:

  • Utiliser un caractère unicode ou quelque chose qui ressemble comme une barre oblique, mais ne l'est pas.
  • Ils ont un bug.

En outre, si vous n' y allez, et modifier les octets d'ajouter une barre oblique caractères dans un nom de fichier, de mauvaises choses vont arriver. C'est parce que vous ne pourrait jamais se référer à ce fichier par son nom :( depuis quand vous l'avez fait, Linux supposent que vous faisiez allusion à un répertoire inexistant. À l'aide de la "rm *" technique ne fonctionnerait pas, car bash simplement se développe que pour le nom de fichier. Même rm -rf ne fonctionnerait pas, depuis un simple strace révèle la façon dont les choses se passent sous le capot (raccourci):

$ ls testdir
myfile2 out
$ strace -vf rm -rf testdir
...
unlinkat(3, "myfile2", 0)               = 0
unlinkat(3, "out", 0)                   = 0
fcntl(3, F_GETFD)                       = 0x1 (flags FD_CLOEXEC)
close(3)                                = 0
unlinkat(AT_FDCWD, "testdir", AT_REMOVEDIR) = 0
...

Notez que ces appels à l' unlinkat échoue parce qu'ils ont besoin de consulter les fichiers par leur nom.

54voto

blacklemon67 Points 428

Vous pouvez utiliser un caractère Unicode qui s'affiche sous la forme "/" (par exemple, ce glyphe apparemment redondant ) en supposant que votre système de fichiers le prenne en charge.

16voto

Nicolas Points 412

Cela dépend de quel système de fichiers que vous utilisez. De certains des plus populaires:

9voto

David Schwartz Points 70129

Seulement avec un encodage convenu. Par exemple, vous pourriez convenir que % sera codé en tant que %% et que %2F signifiera / . Tous les logiciels ayant accédé à ce fichier devraient comprendre le codage.

3voto

keyser Points 5842

La réponse courte est: non, vous ne pouvez pas. C'est une interdiction nécessaire en raison de la définition de la structure de répertoires.

Et, comme mentionné, vous pouvez afficher un caractère Unicode qui "ressemble" à une barre oblique, mais c'est tout ce que vous obtenez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X