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?
^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+v, ctrl+c) devrait fonctionner pour entrer votre nom de fichier difficile dans le terminal.
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 !
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.
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.)
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.
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.
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’
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.
Le moyen le plus simple est de tout déplacer vers le répertoire temporaire, puis rm -r DIRNAME
.
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 utilisantfind -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.