129 votes

FreeBSD : Répertoire appelé ^C (vraiment !) - comment le supprimer ?

J'ai fait une faute de frappe :

$ history
169 9:34    la /usr/local/etc/
170 9:35    sudo mkdir ^C
171 9:36    sudo mkdir /usr/local/etc/dnsmasq.d

Maintenant j'ai un fichier qui s'appelle ^C (ctrl+C) ! !! Lorsque j'utilise ls Je vois juste un point d'interrogation (probablement dû à la locale ?)

% ls -al
total 60
drwxr-xr-x  2 root   wheel    512 Jan 21 09:35 ?        <- this one
drwxr-xr-x  5 admin  wheel    512 Jan 21 16:24 .
drwxr-xr-x  3 root   wheel    512 Jan 20 14:29 ..
-rw-r--r--  1 admin  nobody  1114 Jan 20 19:10 .cshrc
-rw-------  1 admin  wheel   6002 Jan 21 15:27 .history
-rw-r--r--  1 admin  nobody   182 Jan 20 14:29 .login
-rw-r--r--  1 admin  nobody    91 Jan 20 14:29 .login_conf
-rw-------  1 admin  nobody   301 Jan 20 14:29 .mail_aliases
-rw-r--r--  1 admin  nobody   271 Jan 20 19:04 .mailrc
-rw-r--r--  1 admin  nobody   726 Jan 20 19:05 .profile
-rw-------  1 admin  nobody   212 Jan 20 14:29 .rhosts
-rw-r--r--  1 admin  nobody   911 Jan 20 19:06 .shrc
drwx------  2 admin  nobody   512 Jan 20 15:05 .ssh
drwxr-xr-x  2 admin  wheel    512 Jan 20 19:08 bin

% ls -i
3611537 ?   3611534 bin

Je veux supprimer ce fichier. J'essaie mv et en utilisant la complétion par tabulation, il me montre :

% mv
^C/  bin/

De toute évidence, je ne peux pas taper un ^C :-/ Comment supprimer ce fichier ?

192voto

Jacob Points 1861

^V ( ctrl + v ) fonctionne comme une sorte de séquence d'échappement pour la prochaine pression sur la touche, insérant la valeur associée au lieu de prendre n'importe quelle action qui serait normalement associée.

En utilisant ceci, ^V^C ( ctrl + v , ctrl + c ) devrait fonctionner pour entrer votre nom de fichier difficile dans le terminal.

92voto

bishop Points 1077

Vous pouvez également supprimer le fichier par inode :

$ ls -i1
290742 foo
293246 ^C
$ find . -inum 293246 -delete

Quoi que vous fassiez, pour l'amour de Dieu, ne mettez pas -delete antes de -inum :

$ touch foo bar baz quux
$ find . -name '*u*' -delete
$ ls
bar baz foo
$ find . -delete -name 'b*'
find: `./baz': No such file or directory
find: `./bar': No such file or directory
$ ls
$ 

Félicitations, vous venez d'anéantir todo vos fichiers. Avec find , l'ordre des arguments importe ¡!

32voto

keyboardnutz94 Points 61

Une autre option consiste à utiliser rm -ri ./* ; rm vous demandera avant d'effacer tout fichier et répertoire, il vous suffit de répondre y au "mauvais" fichier, et n à tous les autres.

En fait, dans votre cas, vous pouvez même réduire le nombre de réponses nécessaires en faisant rm -ri ./? car votre "mauvais" fichier ne comporte qu'un seul caractère.

23voto

Jakob Points 331

Une option consiste à rechercher le nom du fichier avec autre chose que ls . Si vous savez qu'il a été produit par un verbatim Ctrl + C vous pouvez trouver le caractère ASCII produit à l'aide de la fonction table des caractères de contrôle ou avec une interface plus conviviale comme celle fournie par Python :

>>> import os
>>> os.listdir('.')
['\x03', ...]

Une autre option serait de regarder un vidage hexadécimal de la sortie de ls en utilisant par exemple hexdump .

Ensuite, vous pouvez supprimer le fichier avec (par exemple) cette commande bash :

rmdir "$(printf '\x03')"

(Les guillemets doubles ne sont nécessaires que si le caractère que vous essayez d'imprimer se trouve dans votre fichier IFS variable, telle que \x20 o \x0A mais c'est une bonne habitude de citer les substitutions de commande, sauf si vous savez que vous voulez que le Shell effectue le fractionnement des champs, etc.)

15voto

Jukka Suomela Points 251

Souvent, dans ce genre de situation, il est facile de trouver une modèle de joker qui correspond au fichier concerné.

Dans votre cas, ce serait simplement ? (correspondant à tous les noms de fichiers comportant précisément un caractère).

Vérifiez simplement qu'il correspond bien à ce que vous voulez :

ls -ld ?

Et ensuite, supprimez le répertoire :

rmdir ?

Vous pouvez également le combiner avec tabulation . Vous pouvez taper

rmdir ?

et appuyez sur la touche tabulation, et par exemple, dans bash, il sera remplacé par

rmdir ^C/

et vous pouvez ensuite appuyer sur la touche entrée et cela fait ce que vous voulez.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X