De alguna manera logré crear un archivo que no parece tener un nombre de archivo. Encontré información sobre cómo obtener más detalles del archivo en el siguiente hilo.
Sin embargo, probé algunas de las sugerencias enumeradas y parece que no puedo eliminar el archivo. No estoy seguro de lo que hice para crearlo, pero sucedió al intentar copiar un archivo xml.
Alguna información sobre el archivo es la siguiente;
> ls -lb
total 296
-rw-r--r-- 1 voyager endeavor 137627 Jan 12 12:49 \177
> file *
: XML document
> ls -i
417777
Traté de encontrar usando el interruptor de inum y luego conectarlo a rm, ya que parecía la forma más infalible de deshacerse de él. Sin embargo, el ejemplo dado en la parte inferior del hilo vinculado a continuación falló para mí. Ejemplo fue:
> find -inum 41777 -exec ls -al {} \;
find: illegal option -- i
find: [-H | -L] path-list predicate-list
Así que intenté usar la lista de rutas primero como la siguiente, pero tampoco funcionó:
> find . -inum 41777 -exec ls -al {} \;
No estoy seguro de cuál es el carácter no imprimible \ 177 o cómo puedo pasar eso a un rm
comando, pero realmente quiero asegurarme de no estropear ningún otro archivo / directorio en mi intento de eliminar este archivo.
fuente
\177
es elDEL
caracter ASCII .0
?Respuestas:
El archivo tiene un nombre, pero está hecho de caracteres no imprimibles. Si usa ksh93, bash, zsh, mksh o FreeBSD sh, puede intentar eliminarlo especificando su nombre no imprimible. Primero asegúrese de que el nombre sea correcto con:
ls -ld $'\177'
Si muestra el archivo correcto, luego use rm:rm $'\177'
Otro enfoque (un poco más arriesgado) es usar
rm -i -- *
. Con la opción -i, rm requiere confirmación antes de eliminar un archivo, por lo que puede omitir todos los archivos que desea conservar excepto el uno.¡Buena suerte!
fuente
rm -i *
no hubiera funcionado en este caso; debido a las nuevas líneas, el shell se expandiría*
a algo querm
no reconocería como el nombre del archivo.bash
y GNUrm
. En mi sistema,rm *
,rm -i *
, yrm Ctrl-V DEL TAB ENTER
todo el trabajo correctamente, incluso si el nombre de archivo contiene un carácter de nueva línea (utilicé"\177foo\nbar\n"
). Algunos comandos no manejan bien tales nombres de archivo, pero las herramientas GNU parecen robustas; Las versiones no GNU de las mismas herramientas podrían no funcionar también. En cualquier caso, los diversos trucos en estas respuestas son útiles para conocer.rm
nunca hace ninguna forma de división de palabras, ya sea GNUrm
o no. El shell expande los globos y, cuando ejecuta el comando solicitado, pasa los nombres de archivo resultantes como argumentos separados por nulos (en el código C). Lo peligroso es canalizar una lista de archivos a algo que use líneas nuevas como delimitadores; ver ¿Por qué es un bucle sobre la salida de find una mala práctica?Para quienes lo usan,
vim
ejecútelo en el directorio de trabajo actual:y navegue hasta el archivo con las teclas de flecha o
j/k
. Luego presioneShift+D
y confirme la eliminación cony
.fuente
Probablemente haya una forma de pasar el nombre de archivo
rm
, pero si le preocupa desordenar algo, puede usar un administrador de archivos GUI. Emacs viene con un modo de edición de directorio que puede usar si lo tiene instalado:Abre la carpeta en
emacs
. Puede ejecutaremacs /path/to/folder
o abrir emacs, presionar Esc+ xy ejecutardired
, lo que solicitará la rutahttp://so.mrozekma.com/unix-dired-delete1.png
Muévase a la fila con el archivo que desea eliminar y presione d. Debería ver un
D
en el margen izquierdo al lado del archivo:http://so.mrozekma.com/unix-dired-delete2.png
Presione xpara guardar sus cambios. Se le pedirá que se asegure de que desea eliminar el archivo; prensa y:
http://so.mrozekma.com/unix-dired-delete3.png
fuente
vim
ejecútelo en el directorio de trabajo actual:vim ./
y navegue hasta el archivo con las teclas de flecha. Luego presioneShift+D
y confirme la eliminación cony
.vim
apoyarYa ha demostrado con
file *
que el shell glob (*
) es capaz de recoger este archivo, así que ahora solo haga unrm
en ese glob.rm -i *
n
para todos los archivos excepto el que tiene el nombre de archivo aparentemente invisiblefuente
El archivo en realidad tiene un nombre, pero está hecho de caracteres no imprimibles.
Un método fácil es confiar en la finalización del shell: presione Tabrepetidamente hasta que se inserte el nombre de archivo "extraño". Debe tener su shell configurado para alternar entre posibles finalizaciones:
menu-complete
, que no está vinculado de forma predeterminada, en lugar decomplete
, lo que está vinculado Tabde forma predeterminada. Alternativamente, use Esc *para insertar terminaciones para todos los archivos y elimine los que no desea eliminar de la línea de comandos.setopt auto_menu
osetopt menu_complete
configurar.Si la finalización no es útil en su shell, puede llamar
rm -i -- *
y responder "no" a excepción de este archivo en particular. Si el nombre del archivo no comienza con un carácter imprimible, puede restringir las coincidencias a los archivos cuyo primer carácter no está en un conjunto de caracteres imprimibles:(Tenga cuidado si su patrón puede coincidir con un archivo llamado
-f
, querm
se trataría como una opción).Otro método es llamar
ls -i
para encontrar el inodo del archivo (un inodo identifica de manera única un archivo en un sistema de archivos dado), y luegofind -inum
operar en ese archivo en particular. Este método es principalmente útil cuando el directorio contiene muchos archivos.Si
find
no tiene una-delete
opción, llame alrm
:(Sí, sé que la mayor parte de esto ya se ha publicado. Pero las respuestas con la información relevante lo hacen más complicado de lo que debería ser).
fuente
Intenta usar
echo -e
para obtener el personaje\177
y luegoxargs
pasarlorm
.Resulta queecho
no toma escapes decimales, por lo que convierte a hexadecimal:177
es octal;echo
requiere un\0
(literal, no byte nulo) antes:fuente
\xb1
es decimal177
, lo\0
termina con nulo y-0
le dicexargs
que tome un nombre con terminación nula en lugar de uno con nueva línea.echo
, tal cual, envía 2 nombres de archivo a xargs, y luego arm
... el segundo nombre de archivo es\n
... Esto da como resultado un error o la eliminación de un archivo con ese nombre ('\ n')-n
para deshacerme de la nueva línea.Puedo casi garantizarle que el archivo tiene un nombre. Simplemente es un nombre que contiene caracteres no imprimibles.
Si
rm
no funcionó, entonces usar el resultado defind
con la-inum
opción como argumento pararm
no es probable que ayude; solo va a pasar el mismo argumento arm
, con el mismo problema.El archivo es el único en ese directorio, ¿verdad?
Lo primero que probaría es
cd
ingresar al directorio, luego escribirrm ./
, luego presionar la tecla Tab. Esto debería expandir el argumento al nombre real del archivo, y lo anterior./
debería evitarrm
interpretar el argumento como algo más que un nombre de archivo.Otra solución es
cd
usar el directorio padre y luego usarrm -r
(o, si es necesariorm -rf
) en el directorio. Eso debería eliminar el directorio y todo su contenido, independientemente de su nombre. Luego puede usarmkdir
para recrear el directorio (y tal vezchmod
para restaurar sus permisos).EDITAR:
Mirando su
ls -lb
salida nuevamente, creo que el nombre del archivo comienza con unDEL
carácter ASCII (que es malo, no fatal) y contiene uno o más caracteres de nueva línea (que es realmente malo). Por lo que puedo decir, elrm
comando no puede interpretar una nueva línea como parte del nombre de un archivo.Pero el
unlink()
sistema puede llamar. Aquí hay un script de Perl que reuní que iterará a través de los archivos en el directorio actual y le preguntará a cada uno si desea eliminarlo. No utiliza un comando externo comorm
para eliminar los archivos, por lo que debería ser capaz de manejar cualquier personaje divertido que admita el sistema de archivos (cualquier cosa que no sea ASCIINUL
y/
).Hacer
rm -r
orm -rf
en el directorio que contiene debería funcionar, pero si solo desea eliminar un solo archivo, puede intentarlo.(Otra solución, si hay otros archivos en el directorio que desea mantener, es mover todos los demás archivos a un directorio temporal, luego destruir y recrear el directorio y mover los otros archivos hacia atrás).
(¡Ah, y hagas lo que hayas hecho para crear ese archivo, trata de no volver a hacerlo!
fuente
Si puede encontrar exactamente ese archivo usando el
find
comando, puede usar el-delete
predicado. Solo tenga cuidado y haga-delete
un último parámetro del comando find o le dolerá mucho ...fuente
Estás cerca. Paso a paso, aquí se explica cómo eliminar el archivo por número de inodo.
Primero, encuentre el número de inodo del archivo que desea, utilizando
ls -li
. El número de inodo estará en la primera columna de salida.Por ejemplo:
En este caso, el número de inodo es 311010
Use
find
para buscar el archivo por número de inodo.Asegúrese de que
find
solo devuelva el nombre del archivo que desea eliminar. Por ejemplo:Una vez que esté seguro de que
find
está encontrando el archivo correcto, pase el-delete
parámetro afind
. Eliminará el archivo por ti.fuente
Las otras respuestas son geniales y funcionarán en casi todos los entornos.
Pero, si tiene una interfaz gráfica de usuario ejecutándose, simplemente abra el directorio en nautilus, dolphin, konqueror o su administrador de archivos favorito y debería poder ver y eliminar fácilmente cualquier archivo que tenga un nombre no cooperativo con un par de clics del mouse .
Si no eres un usuario habitual de emacs o vim (como aparece en varias otras respuestas), esta podría ser la forma más fácil de hacerlo.
fuente
Tuve un problema similar con un archivo llamado "\ 033" (el carácter real de "Escape").
Lo anterior le pedirá que elimine los archivos en el directorio actual que no comienzan con una letra o número.
fuente
En su lugar, puede cambiar el nombre del directorio actual a
DirX_OLD
, crear un nuevo directorio con el nombreDirX
y mover todos los archivos necesarios deDirX_OLD
aDirX
. Después de copiar los archivos, puede eliminarlos.DirX_OLD
fuente
En caso de que ayude a alguien, agregaré mis dos centavos. Pude obtener el (los) nombre (s) de archivo usando
stat
el comodín de esta manera:Salida:
Entonces podría usar cadenas ANSI C entre comillas (como se usa en la respuesta aceptada) para acceder a los archivos:
fuente
Cada archivo tiene un nombre, solo necesita encontrar exactamente cuál.
Usaré estos archivos como ejemplos:
Esos archivos se mostrarán como
?
de costumbrels
:Pero si
ls
permite la-Q
opción, debe quedar claro cuál es el nombre real del archivo:esos son los números de inodo y los nombres "Citados" en la
1
columna de los archivos en pwd.Eso es usar la habilidad de un shell (POSIX) para usar expansiones (globbing):
Para tener los nombres con cualquier carácter que no se imprima:
Y para enumerar archivos que pueden tener solo caracteres que no se imprimen:
Luego, para
-i
eliminarlos selectivamente (la opción (interactiva)), use:Solo necesita elegir cuáles borrar borrando
y
la pregunta anterior.fuente
Si tiene una fiesta con autocompletado, esto puede funcionar para usted. Escribí el carácter que se mostró en la lista del directorio. Luego activé el autocompletado y cambié el nombre a algo imprimible.
Esto es lo que funcionó para mí:
fuente
trabajó para mi.
fuente