Cela dépend du système de fichiers que vous utilisez. Parmi les plus populaires :
- ext3 :Non
- ext4 :Non
- jfs :Oui
- reiserfs :Non
- xfs :non
La réponse est que vous ne pouvez pas, sauf si votre système de fichiers a un bogue. Voici pourquoi :
Il existe un appel système pour renommer votre fichier défini dans fs/namei.c
appelé renameat
:
SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
int, newdfd, const char __user *, newname)
Lorsque l'appel système est invoqué, il effectue une recherche de chemin (do_path_lookup
) sur le nom. Continuez à tracer cela, et nous arrivons à link_path_walk
qui a ceci :
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 à n'importe quel système de fichiers. Qu'est-ce que cela signifie? Cela signifie que si vous essayez de passer un paramètre avec un réel '/'
caractère comme nom de fichier en utilisant des moyens traditionnels, il ne fera pas ce que vous voulez. Il n'y a aucun moyen d'échapper au personnage. Si un système de fichiers "supporte" cela, c'est soit parce qu'il :
- Utilisez un caractère Unicode ou quelque chose qui ressemble comme une barre oblique, mais ce n'est pas le cas.
- Ils ont un bogue.
De plus, si vous avez fait entrez et éditez les octets pour ajouter une barre oblique dans un nom de fichier, de mauvaises choses se produiraient. C'est parce que vous ne pourriez jamais faire référence à ce fichier par son nom :( car à chaque fois que vous le feriez, Linux supposerait que vous faisiez référence à un répertoire inexistant. L'utilisation de la technique 'rm *' ne fonctionnerait pas non plus, puisque bash l'étend simplement au nom de fichier. Même rm -rf
ne fonctionnerait pas, car un simple strace révèle comment 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 à unlinkat
échouerait car ils doivent faire référence aux fichiers par leur nom.
Uniquement avec un encodage convenu. Par exemple, vous pourriez convenir que %
sera encodé sous la forme %%
et que %2F
signifiera un /
. Tous les logiciels qui ont accédé à ce fichier devraient comprendre l'encodage.
Vous pouvez utiliser un caractère Unicode qui s'affiche sous la forme /
(par exemple la barre oblique), en supposant que votre système de fichiers le supporte.