Hice un error tipográfico:
$ history
169 9:34 la /usr/local/etc/
170 9:35 sudo mkdir ^C
171 9:36 sudo mkdir /usr/local/etc/dnsmasq.d
¡Ahora tengo un archivo que se llama ^ C (ctrl + C)! Cuando lo uso ls
, solo veo un signo de interrogación (¿probablemente debido a la configuración regional?)
% 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
y
% ls -i
3611537 ? 3611534 bin
Quiero eliminar este archivo Lo intento mv
y cuando uso la finalización de pestaña me muestra:
% mv
^C/ bin/
Obviamente no puedo escribir un ^ C: - / ¿Cómo elimino este archivo?
filesystems
freebsd
Mausy5043
fuente
fuente
dsw
no haya llegado a POSIX.emacs -nw -f dired
da un navegador de directorio. <kbd> D </kbd> elimina el archivo debajo del cursor después de la confirmación.Respuestas:
^V
( ctrl+ v) funciona como una especie de secuencia de escape para la siguiente pulsación de tecla, insertando el valor asociado en lugar de tomar cualquier acción que normalmente estaría asociada.Hacer uso de esto,
^V^C
( ctrl+ v, ctrl+ c) debería funcionar para ingresar su nombre de archivo difícil en la terminal.fuente
^V^C
no no trabajar en el editor de línea Zsh; el widget de inserción entre comillas (buscar en la página^V
) explícitamente no inserta caracteres de interrupción. La respuesta de Jakob (usando printf) puede ser una forma más portátil de proporcionar un carácter de control en un argumento de shell.También puede eliminar el archivo por inode:
Hagas lo que hagas, por el amor de Dios, no lo pongas
-delete
antes-inum
:Felicitaciones, acabas de borrar todos tus archivos. Con
find
, el orden importa argumento !fuente
-delete
antes-inum
? ¿Es esto solo una precaución en caso de que presione enter prematuramente o el orden de los argumentos realmente afecta el resultado?-delete
en el comando, punto, hasta que haya ejecutado el comando sin-delete
verificar que está encontrando lo que desea.-print
lugar de-delete
hace una muy buena prueba.Otra opción es usar
rm -ri ./*
;rm
le preguntará antes de eliminar cualquier archivo y directorio, por lo que solo debe respondery
al archivo "incorrecto" yn
a todos los demás.En realidad, en su caso, incluso puede reducir la cantidad de respuestas necesarias
rm -ri ./?
, ya que su archivo "malo" tiene solo un carácter.fuente
select f in ?; do rm -i "$f"; break; done
tiene todos los beneficios de-i
, sin la agonía de tener que responderno
a los principales indeseables o responder erróneamente sí a uno que desea conservar.rmdir ?/
eliminará todos los directorios vacíos de un solo carácter y se quejará de que los demás no están vacíos.select
existía, ¡bastante bien!-r
(y./
siempre es fácil de olvidar) a mis ejemplos, ya que desafortunadamentermdir
no admite la-i
bandera. Aún así, supongo que en este caso la mejor manera de hacerlo sería una combinación de obispos y su comentario.select
solo existe en algunos shells, por lo que probablemente no te hayas encontrado con él: los scripts y las soluciones destinadas a ser portátiles lo evitan, por lo que es menos probable que lo veamos "en la naturaleza".Una opción es buscar el nombre del archivo con algo diferente a
ls
. Si sabe que fue producido por un literal Ctrl+ C, puede encontrar el carácter ASCII producido usando una tabla de caracteres de control o con una interfaz más amigable como la que proporciona Python:Otra opción sería mirar un volcado hexadecimal de la salida de
ls
, usando eghexdump
.Luego puede eliminar el archivo con (por ejemplo) este comando bash:
(Las comillas dobles solo son necesarias si el carácter que está intentando imprimir está en su
IFS
variable, como\x20
o\x0A
, pero es un buen hábito citar sustituciones de comandos a menos que sepa que desea que el shell realice la división de campos, etc.)fuente
cat -v
(másman ascii
) puede ayudar en la primera parte.os.rmdir('\x03')
directamente desde el shell de Python.A menudo, en este tipo de situaciones, es fácil encontrar un patrón comodín que coincida con el archivo relevante.
En su caso, esto sería simplemente
?
(hacer coincidir todos los nombres de archivo con exactamente un carácter).Solo verifique que realmente coincida con lo que desea:
Y luego elimine el directorio:
También puede combinar esto con la finalización de pestañas . Puedes escribir
y presione tab y, por ejemplo, en bash será reemplazado por
y luego puedes presionar enter y hace lo que quieras.
fuente
Puede usar Midnight Commander (mc) para eliminar el archivo; simplemente seleccione con los botones arriba / abajo y presione F8.
Hice eso ocasionalmente cuando los nombres de los archivos tenían caracteres extraños debido a la codificación.
fuente
Otra forma más: utilícela
stat
para obtener una representación escapada del nombre del directorio:Ahora conoce una representación del nombre del archivo, por lo que puede eliminar el archivo por nombre usando
printf
:O, si está usando bash, puede evitar
printf
:fuente
$'\x03'
es más simple que llamar a printf. Lo mismo para FreeBSD sh que se extiende sobre POSIX shell con algunas características sabrosas.$'...'
, pero evitaría la conversión inútil de octal a hexadecimal en general. Por ejemplo, ¿qué pasaría si se nombrara el archivo'\111'
(en lastat
salida)? ¿Aún lo eliminarías usando$'\x49'
? Un mejor uso de la misma secuencia questat
le dio: en el caso de la OP,rmdir $'\003'
.Una solución que me ha funcionado es:
para recorrer los archivos disponibles hasta que encuentre el que quiero eliminar.
Pero necesita tener la configuración necesaria en su shell para que eso funcione.
fuente
La forma más fácil es mover todo al directorio temporal y luego
rm -r DIRNAME
.fuente
^v
ha funcionado constantemente durante años.^V
necesita un conocimiento específico al mover archivos y la eliminación del directorio principal se puede derivar de lo básico.Si es el único directorio vacío (o si no le importa eliminar otros directorios vacíos), use
rmdir */
. Recibirá mensajes de errorrmdir
acerca de no poder eliminar directorios no vacíos, pero está bien. GNUrmdir
admite--ignore-fail-on-non-empty
, o podrías2>/dev/null
.El seguimiento
/
hace que el globo solo coincida con los nombres de directorio.Puede verificar con anticipación qué directorios vacíos existen bajo el actual usando
find -maxdepth 1 -type d -empty -ls
. (Y puede cambiar-ls
a-delete
si lo desea).Puede usar una expresión glob más específica, como
rmdir [^A-Za-z0-9._]/
hacer coincidir los directorios que comienzan con un nombre de archivo no alfanumérico o de subrayado. También incluí.
, pero las expresiones glob no coinciden.
normalmente de todos modos.Como otros han señalado, puede limitarlo a nombres de un solo carácter con un globo de
?
:rmdir ?/
rmdir
no tiene una-i
opción como lorm
hace, presumiblemente porque los directorios vacíos generalmente no son valiosos y solo se pueden volver a crear.fuente
rmdir
puede decirle si le pasa la-v
opción (al menos en GNU).find -maxdepth 1 -type d -empty -ls
Antes de hacer algo arriesgado, intente esto primero:
En general, es un delimitador que le dice al comando que no seguirán las opciones, pero también permitirá que los caracteres extraños no se interpreten como algo más.
Otro ejemplo de uso es
whois -r -- "-r OBJECT-RIPE"
(-r es un atajo para maduro, pero en el maduro también es un parámetro)
Si no funciona en el primer intento, entonces tal vez intente
rmdir -- "^C"
Pero en mi shell csh no necesito nada de eso, simplemente
rmdir ^C
ya funciona para mí.fuente
rmdir
seguido de <ctrl> C funciona? ¡¿De Verdad?! Esperaría que se comportara de manera diferente, es decir, abortar elrmdir
comando y regresarlo a la línea de comando.