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 rmcomando, pero realmente quiero asegurarme de no estropear ningún otro archivo / directorio en mi intento de eliminar este archivo.
fuente

\177es elDELcaracter 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 quermno reconocería como el nombre del archivo.bashy GNUrm. En mi sistema,rm *,rm -i *, yrm Ctrl-V DEL TAB ENTERtodo 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.rmnunca hace ninguna forma de división de palabras, ya sea GNUrmo 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,
vimejecútelo en el directorio de trabajo actual:y navegue hasta el archivo con las teclas de flecha o
j/k. Luego presioneShift+Dy 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/foldero 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
Den 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
vimejecútelo en el directorio de trabajo actual:vim ./y navegue hasta el archivo con las teclas de flecha. Luego presioneShift+Dy confirme la eliminación cony.vimapoyarYa ha demostrado con
file *que el shell glob (*) es capaz de recoger este archivo, así que ahora solo haga unrmen ese glob.rm -i *npara 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_menuosetopt menu_completeconfigurar.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, quermse trataría como una opción).Otro método es llamar
ls -ipara encontrar el inodo del archivo (un inodo identifica de manera única un archivo en un sistema de archivos dado), y luegofind -inumoperar en ese archivo en particular. Este método es principalmente útil cuando el directorio contiene muchos archivos.Si
findno tiene una-deleteopció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 -epara obtener el personaje\177y luegoxargspasarlorm.Resulta queechono toma escapes decimales, por lo que convierte a hexadecimal:177es octal;echorequiere un\0(literal, no byte nulo) antes:fuente
\xb1es decimal177, lo\0termina con nulo y-0le dicexargsque 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')-npara 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
rmno funcionó, entonces usar el resultado defindcon la-inumopción como argumento pararmno 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
cdingresar 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 evitarrminterpretar el argumento como algo más que un nombre de archivo.Otra solución es
cdusar 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 usarmkdirpara recrear el directorio (y tal vezchmodpara restaurar sus permisos).EDITAR:
Mirando su
ls -lbsalida nuevamente, creo que el nombre del archivo comienza con unDELcará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, elrmcomando 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 comormpara 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 ASCIINULy/).Hacer
rm -rorm -rfen 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
findcomando, puede usar el-deletepredicado. Solo tenga cuidado y haga-deleteun ú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
findpara buscar el archivo por número de inodo.Asegúrese de que
findsolo devuelva el nombre del archivo que desea eliminar. Por ejemplo:Una vez que esté seguro de que
findestá encontrando el archivo correcto, pase el-deletepará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 nombreDirXy mover todos los archivos necesarios deDirX_OLDaDirX. Después de copiar los archivos, puede eliminarlos.DirX_OLDfuente
En caso de que ayude a alguien, agregaré mis dos centavos. Pude obtener el (los) nombre (s) de archivo usando
statel 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
lspermite la-Qopció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
1columna 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
-ieliminarlos selectivamente (la opción (interactiva)), use:Solo necesita elegir cuáles borrar borrando
yla 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