Question 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) !! Quand j'utilise ls Je viens de voir 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 quand on utilise l'onglet de complétion, il me montre:

% mv
^C/  bin/

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


128
2018-01-21 15:55


origine


C'est dommage que dsw ne l'a pas fait dans POSIX. - Mark Plotnick
@ MarkPlotnick: tant pis la original  dsw ne l'a pas fait dans POSIX. - Matteo Italia
Je ne pense pas que vous l’ayez nommée ctrl + C, vous l’avez nommée après le caractère ascii mappé sur ce raccourci clavier, c’est-à-dire ETX (ascii 3) probablement. La police de votre console n'a pas de glyphe pour ce caractère, elle utilise donc un glyphe de substitution générique "?". - jiggunjer
emacs -nw -f dired donne un navigateur de répertoire. <kbd> D </ kbd> supprime le fichier sous le curseur après confirmation. - Thorbjørn Ravn Andersen
@MatteoItalia Il est trop mauvais les caractères de contrôle dans les noms de fichiers et autres idiot  les idées ont été faites dans POSIX ... - pipe


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.

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


189
2018-01-21 16:23



C'est probablement ainsi que OP a créé sa faute de frappe. V et C sont côte à côte sur le clavier. - Stig Hemmer
Ou ils essayaient d'utiliser le presse-papiers de Windows sur le terminal BSD. - Joel Coel
@JoelCoel habitudes ne meurent jamais! - Mafii
Intéressant, ^V^C Est-ce que ne pas travailler dans l'éditeur de ligne Zsh; la quoted-insert widget (recherche dans la page pour ^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. - Miles
@StigHemmer: Ce qui peut aussi arriver, c'est d'appuyer sur Ctrl-C au milieu d'une commande, de l'oublier et de copier-coller la commande plus tard. - Mehrdad


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'anéantir tout vos fichiers. Avec find, l'ordre des arguments compte!


89
2018-01-22 03:42



Pourquoi ne pas mettre -delete avant -inum? S'agit-il d'une précaution dans le cas où vous appuyez sur entrée prématurément ou si l'ordre des arguments affecte réellement le résultat? - detuur
@detuur: l'ordre affecte le résultat. Voir éditer. - bishop
Ne met pas -delete dans la commande, période, jusqu'à ce que vous avez exécuté la commande sans -deletepour vérifier que c'est trouver ce que vous voulez. - Kaz
@Kaz n'aidera pas beaucoup en ajoutant -delete au centre de commande - RiaD
@Kaz utilisant -print au lieu de -delete fait un très bon test. - Mark Ransom


Une autre option est d'utiliser rm -ri ./*; rm vous demandera avant de supprimer tout fichier et 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 ./?, comme votre "mauvais" fichier est juste un caractère long.


31
2018-01-21 20:13



select f in ?; do rm -i "$f"; break; done a tous les avantages de -i, sans l'agonie d'avoir à répondre no conduire des indésirables ou répondre par erreur à un message que vous souhaitez conserver. - bishop
Dans le cas du PO, c'est un répertoire, pas un fichier. rmdir ?/ supprime tous les répertoires vides à caractère unique et se plaint du fait que les autres ne sont pas vides. - Peter Cordes
@bishop: whoa, je ne savais même pas que select existé, plutôt chouette! - Matteo Italia
@PeterCordes: wops, je n'ai pas remarqué qu'on parlait de répertoires; J'ai ajouté -r (et ./ - il est toujours facile d'oublier) à mes exemples, malheureusement rmdir 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. - Matteo Italia
@ MatteoItalia select n’existe que dans certains shells, ce qui explique probablement pourquoi vous ne l’avez pas rencontrée - les scripts et les solutions conçus pour être portables l’évitent, et nous avons donc moins de chances de le voir "à l’état sauvage". - mtraceur


Une option consiste à rechercher le nom du fichier avec autre chose que ls. Si vous savez que cela a été produit par un verbatim Ctrl+C, vous pouvez trouver le caractère ASCII produit en utilisant 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 lsen utilisant par exemple hexdump.

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

rmdir "$(printf '\x03')"

(Les guillemets ne sont nécessaires que si le personnage que vous essayez d’imprimer est dans votre IFS variable, telle que \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 du champ, etc.)


23
2018-01-21 18:51



Également cat -v (plus man ascii) peut aider pour la première partie. - Matteo Italia
... ou vous utilisez os.rmdir('\x03') directement à partir du shell Python. - moooeeeep


Souvent, dans ce genre de situation, 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).

Il suffit de vérifier que cela correspond vraiment à ce que vous voulez:

ls -ld ?

Et puis supprimez le répertoire:

rmdir ?

Vous pouvez également combiner cela avec onglet complétion. Vous pouvez taper

rmdir ?

et appuyez sur l'onglet, et par exemple à bash il sera remplacé par

rmdir ^C/

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


15
2018-01-21 21:02





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 parfois lorsque les noms de fichiers avaient des caractères étranges dus à l'encodage.


11
2018-01-21 20:29



Ou à peu près tout autre gestionnaire de fichiers. - Stig Hemmer
@ StigHemmer bien sûr, certains font mieux que d'autres pour afficher certains noms de fichiers. La réponse pourrait probablement expliquer pourquoi MC est un choix optimal par rapport à quelques autres. Je ne saurais pas, car je ne l'ai jamais utilisé. - can-ned_food


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

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

Maintenant, vous connaissez une représentation du nom de 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
2018-01-22 10:25



BTW si le shell est bash, $'\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 intéressantes. - Netch
@Netch bon point à propos de bash $'...', mais j’éviterais une conversion inutile d’octal à hexadécimal en général. Par exemple. Et si le fichier était nommé '\111' (dans stat sortie)? Voulez-vous toujours l'enlever en utilisant $'\x49'? Mieux vaut utiliser la même séquence que stat vous a donné: dans le cas du PO, rmdir $'\003'. - Ruslan


Une solution qui a fonctionné pour moi est la suivante:

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

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

Mais vous devez avoir le réglages nécessaires dans votre coquille pour que cela fonctionne.


6
2018-01-22 08:31



^ C est vraiment au début de la séquence de tabulation, donc +1 pour vous. - joshudson


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


5
2018-01-21 16:31



Cela vous semble-t-il plus facile que la réponse acceptée? - chicks
@chicks: Ce n'est en fait pas une si mauvaise réponse. J'ai vu ^ V ^ C ne fonctionnait pas afin que quelqu'un puisse rester coincé. - joshudson
Ce n'est pas une erreur en soi, mais cela semble être beaucoup de travail supplémentaire par rapport aux solutions plus directes. Peut-être que je suis gâté par Linux, mais ^v a toujours travaillé pour moi pendant des siècles. - chicks
@chicks ^V besoin de connaissances spécifiques lors du déplacement de fichiers et la suppression du répertoire parent peut être déduite des bases. - Kondybas
Ctrl + V est dangereusement ambigu en fonction de votre environnement de travail… Certains émulateurs de terminaux pourraient l’interpréter comme une pâte. Si votre tampon de collage contient le nom de quelque chose que vous ne voulez pas supprimer - et une nouvelle ligne, vous pourriez être en train de regarder un problème. - rackandboneman


Si c'est le seul répertoire vide (ou si vous ne vous souciez pas de supprimer d'autres répertoires vides), utilisation rmdir */. Vous recevrez des messages d'erreur de rmdir de ne pas être en mesure de supprimer des répertoires non vides, mais c'est bien. GNOU rmdir les soutiens --ignore-fail-on-non-emptyou vous pourriez 2>/dev/null.

La fuite / 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 à -delete si tu veux).

Vous pouvez utiliser une expression globale plus spécifique, telle que rmdir [^A-Za-z0-9._]/ faire correspondre les répertoires commençant par un nom de fichier non alphanumérique ou souligné. J'ai aussi inclus ., mais les expressions globales ne correspondent pas . normalement quand même.


Comme d’autres l’ont fait remarquer, vous pouvez le limiter à des noms à caractère unique avec un glob de ?: rmdir ?/

rmdir n'a pas de -i option le chemin rm fait, probablement parce que les répertoires vides ne sont généralement pas précieux et peuvent simplement être recréés.


1
2018-01-22 05:39



Vous voulez savoir quels répertoires vous souhaitez recréer, et rmdir peut vous dire si vous passez -v l’option (du moins dans GNU). - Ruslan
@Ruslan: Pas si vous aviez d'autres répertoires obsolètes que vous n'aimiez plus, et les supprimer serait un bonus. Vous pouvez rechercher des répertoires vides avec find -maxdepth 1 -type d -empty -ls - Peter Cordes