Como puede ver a continuación, los archivos tienen caracteres poco comunes.
Eliminarlos en la terminal o Dolphin devuelve el error:
El fichero o directorio no existe
Ejecutar ls -la
en el directorio me dio esta salida:
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ??
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ?2?.???љ?!?Gb??σ?[?F?
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 3l??#g?w????O?JKB7?co??քH??bT?NA???S???X?I?A?qC??M?I???
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ??8??-?@,?Zp?[?bI????7^?ñ[?ڏ??z?O???ч??eEȰ?+??,OF??h
Ejecuté un fsck
comando en la partición desde otro sistema operativo pero no cambió nada.
¿Cómo elimino estos archivos?
files
filesystem
encoding
filename
karjedavpalaa
fuente
fuente
Respuestas:
Una forma simple sería eliminar estos archivos por su inodo. :)
Use
ls -li
en el directorio con los caracteres poco comunes para mostrar el número de inodo de cada archivo, por ejemplo,Luego, use la
find
utilidad para eliminar el archivo correspondiente por su nombre, usando la sintaxisfind <somepath> -inum <inode_number> -exec rm -i {} \;
, como en el siguiente ejemplo:La
-i
opciónrm
no es realmente necesaria, solo la agregué para evitar que elimines accidentalmente archivos que no querías eliminar. :) Hacerm
que se solicite confirmación para cada archivo que desea eliminar.Si desea eliminar varios archivos por sus inodos, puede usar la sintaxis
-o
(significado o ) parafind
:Puede agregar más números de inodo extendiendo la expresión entre paréntesis con más
-o -inum <inode_number>
expresiones.fuente
rm -ri .
?rm -ri .
no está eliminando archivos por inodo. Simplemente se repetirá a través de todo el directorio de trabajo y solicitará cada archivo si desea eliminarlo, y debe estar muy atento a qué archivos está solicitando para no eliminar accidentalmente los no deseados. Ciertamente no me gustaría usar este comando para mi directorio de inicio, ya que contiene MUCHOS archivos. ;)-inum
le dicefind
que busque archivos por su número de inodo. (2){}
coincide con los archivos encontrados porgrep
. (3) \ escapa al;
símbolo que termina el comando pasado a la-exec
opción defind
. (4) He editado mi respuesta para explicar cómo eliminar varios archivos de una vez.Es importante comprender que este no es el tipo de "corrupción del sistema de archivos" que
fsck
ayudará. En lo que respecta al sistema de archivos, los nombres de archivo pueden ser cualquier secuencia de bytes , siempre que ningún byte tenga el valor 0x00 (ASCII NUL, marcador de fin de cadena C) o 0x2F (/
, el separador de directorio). (Si un nombre de archivo de alguna manera obtiene un byte 00 o 2F incrustado en él,fsck
debería solucionarlo).Más bien, lo que tiene son nombres de archivos que el software de la aplicación (Dolphin
ls
) cree que contienen caracteres que no se pueden mostrar en su "ubicación", por lo que los reemplaza con caracteres de marcador de posición. Tampoco puede escribir esos caracteres, por lo que manipular los archivos es más difícil, pero puede hacerlo siempre que lo haga sin tener que escribir o copiar y pegar el nombre. Por ejemplo, si elimina o cambia el nombre de los archivos del problema directamente desde Dolphin, eso debería funcionar (diría que si no funciona, eso es un error en Dolphin).Si necesita hacer algo al respecto desde el shell (por ejemplo, si son propiedad de
root
un programa GUI y, por lo tanto, no pueden ser modificados), puede nombrarlos indirectamente utilizando patrones "glob", que se expandirán a la secuencia correcta (s) de bytes y transmitidos.Ahora, por supuesto, no querrás eliminar cosas por accidente porque tu patrón global coincide demasiado, por lo que mi recomendación sería usar la
rename
utilidad Perl para convertir cada nombre de archivo a su codificación hexadecimal:Esto no destruye ninguna información, ni el archivo en sí mismo, ni el significado que originalmente se haya codificado en el nombre de archivo antes de que fuera destruido. Se puede deshacer para archivos específicos con, por ejemplo,
Precaución: hay dos programas nombrados
rename
, de diferentes orígenes; los comandos anteriores solo funcionarán con el que se originó con Perl. En Ubuntu, el que desea es el del paquete "rename", no el del paquete "util-linux".rename -h
distinguirá: esto es lo que quieres ...... Esto no es lo que quieres ...
La clave para buscar es "perlexpr". Es posible que tenga una versión anterior del cambio de nombre de Perl que no comprende todas las opciones anteriores, pero el comando que mostré debería funcionar.
Editar: en 14.04 .5, el script perl que se incluye
rename
no admite el modificador -h. Puede confirmar que tiene la correcta marcando su página de manual,man rename
en cuyo caso la línea superior contendrá:fuente
file $(which rename)
imprime? (Asegúrese de tener elfile
paquete instalado, primero.)/usr/bin/rename: symbolic link to /etc/alternatives/rename
(file
está instalado de forma predeterminada) En realidad, debe perseguir los enlaces simbólicos para obtener,/usr/bin/file-rename: a /usr/bin/perl -w script, ASCII text executable
peroman rename
es una indicación más rápida ...--version
; el comando que sugerí aún debería funcionar. (/usr/share/doc/rename/changelog.gz en mi computadora, que ejecuta Debian inestable, indica que--version
se agregó en la versión 0.10 del cambio de nombre de Perl, en 2013. Me sorprende que Ubuntu todavía envíe algo más antiguo que eso, pero este programa no ha cambiado su funcionalidad desde 2007 (!) así que está bien.)