web-dev-qa-db-fra.com

Impossible de supprimer un fichier avec un '?' dans le nom du fichier

Impossible de supprimer un fichier avec un '?' dans le nom du fichier, il ne parvient pas à supprimer avec le message "le fichier n'existe pas".

J'ai essayé via le terminal en utilisant

rm -f ./pathtofile\?.mkv

Mais malgré l'absence de message d'erreur, le fichier existe toujours. Aucune suggestion?

3
Noki

Le ? est très probablement un autre symbole non-ASCII que votre programme de terminal ne peut pas afficher. Il affiche donc ?. Ceci est facilement prouvé - vous pouvez exécuter touch ?.mkv et rm ?.mkv - les deux commandes s'exécutent parfaitement.

De tels fichiers sont facilement supprimés à l'aide d'un gestionnaire de fichiers à interface graphique.

Sinon, vous pouvez essayer d'utiliser des caractères génériques. Si commande:

ls pathtofile\FewLetters*.mkv

répertorie un seul fichier que vous pouvez exécuter en toute sécurité:

rm pathtofile\FewLetters*.mkv`.

Enfin, vous pouvez essayer de la manière la plus dure mais la plus sûre décrite dans la section Impossible de supprimer les fichiers contenant des caractères spéciaux dans le nom du fichier comme indiqué par Android Dev ci-dessus.

2
sмurf

Le fichier contient-il vraiment un ? dans le nom du fichier ou s'agit-il d'un caractère non imprimable que ls s'affiche sous la forme d'un ??

$ touch $'a\ab' 'a?b'
$ ls
a?b  a?b

Un fichier contient un caractère ASCII BELL, et l'autre un simple point d'interrogation.

Les versions plus récentes de ls peuvent afficher les caractères spéciaux sous une forme plus claire par défaut:

$ touch $'b\aa'
$ ls
'b'$'\a''a'

ls -q est la façon dont les anciennes versions de ls affichent les caractères non imprimables par défaut. Donc, si vous ne faites que ls dans n’importe quelle version actuelle d’Ubuntu, vous ne verrez probablement que des points d’interrogation.

Essayez plutôt l'un des:

$ ls -b
a?b  a\ab
$ printf "%q\n" *
a\?b
$'a\ab'

Si la sortie de l'un de ces éléments ne comporte pas de point d'interrogation, le nom du fichier ne comporte pas de point d'interrogation.

Vous pouvez utiliser le résultat de printf pour supprimer:

rm a\?b
rm $'a\ab'

Ou comptez sur l'achèvement de l'onglet:

$ rm a<tab>
a?b   a^Gb 

Si ^G s'affiche, appuyez sur CtrlV ensuite CtrlG pour y entrer. Ou dites bash parcourir les onglets :

$ bind tab:menu-complete
$ rm a<tab>
$ rm a\?b<tab>
$ rm a^Gb

Dans les deux cas, utiliser rm a?b pourrait fonctionner, mais est dangereux. Cela correspondrait à tous les noms de fichiers commençant par a, se terminant par b et comportant un caractère entre eux:

$ touch acb; printf "%q\n" a?b
a\?b
$'a\ab'
acb

Donc, si vous faites rm a?b (ou pire, rm a*b), vous risquez de supprimer des fichiers que vous n'aviez pas l'intention de faire.

3
muru

rm -f 'path?.mkv' fonctionne pour moi. Corrigez-moi si je me trompe, mais le ' ' désactive la fonctionnalité de certains caractères spéciaux tels que ?. Désolé pour la mauvaise mise en forme, la vitesse d'exécution doit être pressée.
J'espère que ça aide, passez une bonne journée =)

2
IcyIcyIce