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 je l'utilise, ls
je ne vois qu'un point d'interrogation (probablement en raison 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 veux supprimer ce fichier. J'essaie mv
et lorsque j'utilise l' onglet de complétion, il me montre:
% mv
^C/ bin/
Évidemment, je ne peux pas taper ^ C: - / Comment puis-je supprimer ce fichier?
filesystems
freebsd
Mausy5043
la source
la source
dsw
n'ait pas été intégré à POSIX.emacs -nw -f dired
donne un navigateur de répertoire. <kbd> D </ kbd> supprime le fichier sous le curseur après confirmation.Réponses:
^V
( ctrl+ v) fonctionne comme une sorte de séquence d'échappement pour la prochaine pression sur une touche, insérant la valeur associée au lieu de prendre les mesures qui seraient normalement associées.Faisant usage de cela,
^V^C
( ctrl+ v, ctrl+ c) doit travailler pour saisir votre nom difficile dans le terminal.la source
^V^C
ne fonctionne pas dans l'éditeur de ligne Zsh; le widget quoted-insert (recherche dans la page^V
) explicitement n'insère pas de caractères d'interruption. La réponse de Jakob (utilisant printf) peut constituer un moyen plus portable de fournir un caractère de contrôle dans un argument de shell.Vous pouvez également supprimer le fichier par inode:
Quoi que vous fassiez, pour l'amour de Dieu, ne mettez pas
-delete
avant-inum
:Félicitations, vous venez d'effacer tous vos fichiers. Avec
find
, l' ordre des arguments compte !la source
-delete
avant-inum
? S'agit-il d'une précaution au cas où vous appuyez sur entrée prématurément ou l'ordre des arguments affecte-t-il réellement le résultat?-delete
dans la commande, point final, jusqu'à ce que vous ayez exécuté la commande sans-delete
vérifier qu'elle trouve ce que vous voulez.-print
au lieu de-delete
fait un très bon test.Une autre option est d'utiliser
rm -ri ./*
;rm
vous demandera avant de supprimer un fichier ou un répertoire, il vous suffira donc de répondrey
au "mauvais" fichier etn
à tous les autres.En fait, dans votre cas, vous pouvez même réduire le nombre de réponses nécessaires
rm -ri ./?
, car votre "mauvais" fichier ne contient qu'un seul caractère.la source
select f in ?; do rm -i "$f"; break; done
a tous les avantages de-i
, sans l'agonie d'avoir à répondreno
à la conduite des indésirables ou répondre par erreur à une question que vous souhaitez conserver.rmdir ?/
supprime tous les répertoires vides à caractère unique et se plaint du fait que les autres ne sont pas vides.select
existait, plutôt chouette!-r
(et./
- il est toujours facile d'oublier) à mes exemples, car malheureusement,rmdir
il ne supporte pas le-i
drapeau. Néanmoins, je suppose que dans ce cas, la meilleure solution consiste à combiner l'évêque et votre commentaire.select
n'existe que dans certains coquillages, ce qui explique probablement pourquoi vous ne l'avez pas rencontré: les scripts et les solutions conçus pour être portables l'évitent, nous avons donc moins de chances de le voir "à l'état sauvage".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 généré à l'aide d'une table de caractères de contrôle ou d'une interface plus conviviale comme celle fournie par Python:Une autre option serait de regarder un vidage hexadécimal de la sortie de
ls
, en utilisant par exemplehexdump
.Ensuite, vous pouvez supprimer le fichier avec (par exemple) cette commande bash:
(Les guillemets ne sont nécessaires que si le caractère que vous essayez d'imprimer se trouve dans votre
IFS
variable, telle que\x20
ou\x0A
, mais c'est une bonne habitude de citer des substitutions de commandes à moins que vous ne souhaitiez que le shell effectue la division du champ, etc.)la source
cat -v
(plusman ascii
) peut aider pour la première partie.os.rmdir('\x03')
directement à partir du shell Python.Souvent, dans ce type de situation, il est facile de créer un modèle générique correspondant au fichier en question.
Dans votre cas, ce serait simplement
?
(faire correspondre tous les noms de fichiers avec exactement un caractère).Il suffit de vérifier que cela correspond vraiment à ce que vous voulez:
Et puis supprimez le répertoire:
Vous pouvez également combiner ceci avec la complétion par tabulation . Vous pouvez taper
et appuyez sur l'onglet, et par exemple dans bash il sera remplacé par
et vous pouvez ensuite appuyer sur entrée et il fait ce que vous voulez.
la source
Vous pouvez utiliser Midnight Commander (mc) pour supprimer le fichier - il suffit de sélectionner avec les boutons haut / bas et d'appuyer sur F8.
Je le faisais de temps en temps lorsque les noms de fichiers avaient des caractères étranges dus à l'encodage.
la source
Encore une autre façon: utilisez
stat
pour obtenir une représentation d'échappement du nom du répertoire:Vous connaissez maintenant une représentation du nom du fichier. Vous pouvez donc supprimer le fichier par son nom en utilisant
printf
:Ou, si vous utilisez bash, vous pouvez éviter
printf
:la source
$'\x03'
est plus simple que d’appeler printf. La même chose pour FreeBSD sh qui est étendu sur le shell POSIX avec quelques fonctionnalités savoureuses.$'...'
, mais j'éviterais une conversion inutile d'octal en hexadécimal en général. Par exemple, que faire si le fichier était nommé'\111'
(enstat
sortie)? Voulez-vous toujours l'enlever en utilisant$'\x49'
? Mieux utiliser la même séquence questat
vous a donné: dans le cas de l'OP,rmdir $'\003'
.Une solution qui a fonctionné pour moi est la suivante:
parcourir les fichiers disponibles jusqu'à ce que je trouve celui que je veux supprimer.
Mais pour que cela fonctionne, vous devez disposer des paramètres nécessaires dans votre shell.
la source
Le moyen le plus simple est de tout déplacer dans le répertoire temporaire, puis
rm -r DIRNAME
.la source
^v
fait toujours très longtemps que je travaille.^V
besoin de connaissances spécifiques pour pouvoir déplacer des fichiers et la suppression du répertoire parent peut être déduite des bases.S'il s'agit du seul répertoire vide (ou si vous ne vous souciez pas de supprimer d'autres répertoires vides), utilisez
rmdir */
. Vous obtiendrez des messages d'erreurrmdir
indiquant que vous ne pourrez pas supprimer les répertoires non vides, mais c'est bien. GNUrmdir
prend en charge--ignore-fail-on-non-empty
, ou vous pourriez2>/dev/null
.La fin
/
fait en sorte que le glob ne corresponde 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
en-delete
si vous voulez).Vous pouvez utiliser une expression globale plus spécifique, par exemple
rmdir [^A-Za-z0-9._]/
pour faire correspondre les répertoires commençant par un nom de fichier non alphanumérique ou un trait de soulignement. J'ai aussi inclus.
, mais les expressions globales ne correspondent pas.
normalement de toute façon.Comme d'autres l'ont fait remarquer, vous pouvez le limiter à des noms à caractère unique avec un glob de
?
:rmdir ?/
rmdir
n'a probablement pas la même-i
optionrm
, probablement parce que les répertoires vides ne sont généralement pas utiles et peuvent simplement être recréés.la source
rmdir
vous dire si vous lui passez l'-v
option (au moins dans GNU).find -maxdepth 1 -type d -empty -ls
Avant de faire quelque chose de risqué, essayez ceci en premier:
En général - est un délimiteur indiquant à la commande que aucune commande ne suivra, mais cela permettra également aux caractères étranges de ne pas être interprétés comme autre chose.
Un autre exemple d'utilisation est
whois -r -- "-r OBJECT-RIPE"
(-r est un raccourci pour mûr, mais dans le whois mûr est aussi un paramètre)
Si cela ne fonctionne pas au premier essai, alors peut-être essayer
rmdir -- "^C"
Mais sur mon shell csh, je n’en ai pas besoin, tout simplement
rmdir ^C
déjà pour moi.la source
rmdir
suivi de <ctrl> C fonctionne? Vraiment?! Je m'attendrais à ce qu'il se comporte différemment, à savoir l'abandon de larmdir
commande et le renvoi à la ligne de commande.