web-dev-qa-db-fra.com

FreeBSD: répertoire appelé ^ C (vraiment!) - comment 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 à cause des paramètres régionaux?)

% 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

et

% ls -i
3611537 ?   3611534 bin

Je souhaite supprimer ce fichier. J'essaie mv et lors de l'utilisation de la tabulation, cela me montre:

% mv
^C/  bin/

Évidemment, je ne peux pas taper un ^ C: -/Comment supprimer ce fichier?

128
Mausy5043

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

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

189
Håkan Lindqvist

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 avant -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'effacer tous vos fichiers. Avec find, l'ordre des arguments est important !

90
bishop

Une autre option consiste à utiliser rm -ri ./*; rm vous demandera avant de supprimer un fichier et un répertoire, il vous suffit donc 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.

32
Matteo Italia

Une option consiste à rechercher le nom de 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 d'un tableau 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 est dans votre variable IFS, comme \x20 ou \x0A, mais c'est une bonne habitude de citer des substitutions de commandes, sauf si vous savez que vous voulez que le shell effectue la division des champs, etc.)

23
Jakob

Souvent, dans ce genre de situations, il est facile de trouver un motif générique qui correspond au fichier correspondant.

Dans votre cas, ce serait simplement ? (correspondant à tous les noms de fichiers avec exactement un caractère).

Vérifiez simplement que cela correspond vraiment à ce que vous voulez:

ls -ld ?

Et puis supprimez le répertoire:

rmdir ?

Vous pouvez également combiner cela avec tabulation complétée. Vous pouvez taper

rmdir ?

et appuyez sur tab, et par ex. en bash il sera remplacé par

rmdir ^C/

et vous pouvez ensuite appuyer sur Entrée et il fait ce que vous voulez.

15
Jukka Suomela

Vous pouvez utiliser Midnight Commander (mc) pour supprimer le fichier - sélectionnez simplement avec les boutons haut/bas et appuyez sur F8.

Je l'ai fait de temps en temps lorsque les noms de fichiers avaient des caractères étranges en raison de l'encodage.

11
filo

Encore une autre façon: utilisez stat pour obtenir une représentation échappée du nom du répertoire:

$ stat *|grep File:
  File: ‘\003’

Vous connaissez maintenant une représentation du nom du fichier, vous pouvez donc supprimer le fichier par son nom en utilisant printf:

$ rmdir -v "$(printf '\003')"
rmdir: removing directory, ‘\003’

Ou, si vous utilisez bash, vous pouvez éviter printf:

$ rmdir -v $'\003'
rmdir: removing directory, ‘\003’
7
Ruslan

Une solution qui a fonctionné pour moi est:

rm ./[Tab][Tab][Tab]...

pour parcourir les fichiers disponibles jusqu'à ce que je trouve celui que je souhaite supprimer.

Mais vous devez avoir les paramètres nécessaires dans votre Shell pour que cela fonctionne.

6
joeytwiddle

Le moyen le plus simple est de tout déplacer vers le répertoire temporaire, puis rm -r DIRNAME.

5
Kondybas

Si c'est le seul répertoire vide (ou si vous ne vous souciez pas de supprimer d'autres répertoires vides), tilisez rmdir */. Vous obtiendrez des messages d'erreur de rmdir à propos de l'impossibilité de supprimer des répertoires non vides, mais c'est très bien. GNU rmdir prend en charge --ignore-fail-on-non-empty, ou vous pourriez 2>/dev/null.

La fin / fait que le glob ne correspond qu'aux noms de répertoire.

Vous pouvez vérifier à l'avance quels répertoires vides existent sous le répertoire actuel en utilisant
find -maxdepth 1 -type d -empty -ls. (Et vous pouvez changer le -ls à -delete si tu veux).

Vous pouvez utiliser une expression globale plus spécifique comme rmdir [^A-Za-z0-9._]/ pour faire correspondre les répertoires commençant par un nom de fichier non alphanumérique ou souligné. J'ai également inclus ., mais les expressions globales ne correspondent pas à . normalement de toute façon.


Comme d'autres l'ont souligné, vous pouvez le limiter aux noms à un seul caractère avec un glob de ?: rmdir ?/

rmdir n'a pas de -i option comme rm, probablement parce que les répertoires vides n'ont généralement pas de valeur et peuvent être recréés.

1
Peter Cordes