Desmarqué un archivo tar corrupto y logré terminar con un directorio que no puedo eliminar. Si trato de eliminarlo, parece que no se puede encontrar, pero ls
muestra que está presente, tanto con bash como con python. comportamiento similar, excepto justo después de que trato de eliminarlo rm -rf
, se ls
queja de que no puede encontrarlo, luego lo enumera (ver más abajo después rm -rf
). El find
comando muestra que el archivo está presente, pero aún no se me ocurre una forma de eliminarlo.
Aquí están mis intentos:
Aquí ves ambos ls
y find
aceptas que tenemos un directorio,
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -print0
./mikeaâcnt
Pero no puedo eliminarlo:
rl]$ find -maxdepth 1 -type d -empty -print0 | xargs -0 rm -f -v
rm: cannot remove `./mikeaâ\302\201\302\204cnt': Is a directory
rl]$ ls
mikeaâ??cnt
Sin cd
embargo, puedo hacerlo y está vacío:
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ pwd
.../rl/mikeaâcnt
mikeaâ^Á^Äcnt]$ cd ../
rl]$ ls
mikeaâ??cnt
vea a continuación que no es un archivo simple sino un directorio, además se ls
comporta de manera divertida después de rm -rf
que dice que no puede encontrar el archivo y luego lo enumera inmediatamente después:
rl]$ rm mikeaâ^Á^Äcnt/
rm: cannot remove `mikeaâ\302\201\302\204cnt/': Is a directory
rl]$ rm -rf mikeaâ^Á^Äcnt/
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
Entonces este es el intento con python, se encuentra el archivo, pero el nombre no se puede usar como un nombre que se puede eliminar:
rl]$ python
Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import shutil
>>> os.listdir('.')
['mikea\xc3\xa2\xc2\x81\xc2\x84cnt']
>>> shutil.rmtree(os.listdir('.')[0] )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/shutil.py", line 204, in rmtree
onerror(os.listdir, path, sys.exc_info())
File "/usr/lib64/python2.6/shutil.py", line 202, in rmtree
names = os.listdir(path)
OSError: [Errno 2] No such file or directory: 'mikea\xc3\xa2\xc2\x81\xc2\x84cnt'
incluso cuando uso la finalización de pestañas, el nombre que recoge no se puede usar:
rl]$ rm -rf mikeaâ^Á^Äcnt
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
usando el nombre que Python muestra con bash obtengo esto:
rl]$ rm -rf "mikea\xc3\xa2\xc2\x81\xc2\x84cnt"
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
¿Hay algo que pueda hacer para deshacerme de este directorio corrupto? El sistema de archivos subyacente (NFS) parece funcional y no se informan otros problemas, y no he tenido tales problemas hasta el archivo tar corrupto.
EDITAR: Aquí está usando find
la propia -exec
opción para llamarrm
rl]$ find -maxdepth 1 -type d -empty -exec rm -f {} \;
find: `./mikeaâ\302\201\302\204cnt': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
pero el archivo todavía está allí (se ls
queja de que no puede encontrarlo, pero luego lo muestra de todos modos)
2da EDICIÓN:
rl]$ find -maxdepth 1 -type d -empty -exec rm -rf {} \;
find: `./mikeaâ\302\201\302\204cnt': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
El comportamiento sigue sin cambios, el archivo sigue presente
3a EDICIÓN:
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -exec rm -rf {} +
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
Parece que hay más en el nombre que mikeaâcnt
mirar la salida del intento de Python mikea\xc3\xa2\xc2\x81\xc2\x84cnt
, y esta captura de pantalla:
4th EDIT: este es el intento con un comodín:
rl]$ echo *
mikeaâcnt
rl]$ echo mike*
mikeaâcnt
rl]$ rm -rf mike*
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
y mi localidad:
rl]$ locale
LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=
5ta Edición:
rl]$ ls -i
ls: cannot access mikeaâcnt: No such file or directory
? mikeaâ??cnt
pero también el comportamiento ha cambiado, ahora ls
y cd
haz esto:
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt
mikeaâcnt: No such file or directory.
Esto ha sucedido después de los intentos de eliminación, estoy pensando que podrían ser problemas de NFS como se sugiere en una de las respuestas aquí por vinc17.
6ª EDICIÓN: Esta es la salida lsof
yls -a
rl] $ / usr / sbin / lsof mikeaâ ^ Á ^ Äcnt lsof: error de estado en mikeaâ \ xc2 \ x81 \ xc2 \ x84cnt: No existe tal archivo o directorio
arriba está mal, aquí está la lsof
invocación correcta : (rl es el directorio padre)
rl]$ /usr/sbin/lsof | grep mike | grep rl
tcsh 11926 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
lsof 14733 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
grep 14734 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
grep 14735 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
lsof 14736 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
rl]$
rl]$ ls -a
ls: cannot access mikeaâcnt: No such file or directory
. .. mikeaâ??cnt
7ª Edición: movimiento no va a funcionar, (I probado antes de todo esto, pero no lo hice guardar la salida), pero tiene el mismo problema que ls
y rm
con el archivo.
8ª EDICIÓN: esto está usando los caracteres hexadecimales como se sugiere:
rl]$ ls --show-control-chars | xxd
0000000: 6d69 6b65 61c3 a2c2 81c2 8463 6e74 0a mikea......cnt.
rl]$ rmdir $'mikea\6d69\6b65\61c3\a2c2\81c2\8463\6e74\0acnt'
rmdir: failed to remove `mikea\006d69\006b651c3\a2c2\\81c2\\8463\006e74': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
Novena edición: para el stat
comando:
rl]$ stat mikeaâ^Á^Äcnt
stat: cannot stat `mikeaâ\302\201\302\204cnt': No such file or directory
rl]$
Parece aún más probable de todos los resultados, hay un error u otro mal comportamiento de NFS como se sugiere en los comentarios.
Edición 10: Esta es una salida extraña en una esencia ya que es tan grande, es la salida o estos dos comandos:
strace -xx rmdir ./* | grep -e '-1 E'`
strace -xx -e trace=file ls -li`
https://gist.github.com/mikeatm/e07fa600747a4285e460
Edición 11: Entonces, antes de lo anterior rmdir
, noté que podía cd
ingresar al directorio, pero después de rmdir
eso no pude cd
nuevamente, similar a ayer. Los archivos .
y ..
estaban presentes:
rl]$ ls
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ ls -a
. ..
mikeaâ^Á^Äcnt]$ cd ../
Edición final: vi a un administrador local sobre esto y se solucionó iniciando sesión en el servidor y eliminando desde allí. La explicación de ellos es que podría ser un problema que los conjuntos de caracteres en el nombre sean inapropiados.
find
la salida a un comando diferente en lugar de solo usar suexec
opción?mv
. tal vez puedas borrarlo después de eso. Alternativamente, puede intentar mover el directorio a un nivel de carpeta más profundo (tal vez con un comodín) y luego eliminar la carpeta a la que lo ha movido.Respuestas:
El siguiente extracto de este ensayo explica potencialmente por qué ese directorio se niega a ser eliminado:
fuente
Una forma de eliminar archivos / directorios como este es mediante su referencia de inodo.
Para encontrar los inodes para elementos en el directorio actual:
Para borrar esto:
fuente
?
como referencia de inodo. ¿Cómo lo eliminas entonces?No debe usar caracteres que no sean ASCII en la línea de comando ya que, como puede ver, por alguna razón, no necesariamente se corresponden con el nombre del archivo (Unicode tiene varias formas de expresar letras acentuadas). Algo como:
debería funcionar ya que el nombre de archivo es generado directamente por el shell. Pero asegúrese de que solo haya una coincidencia (haga una
echo mike*
primera para confirmar).Bueno, si
cd
funciona, entonces no hay razón por la cualrm
, ols
debería decirNo such file or directory
, por lo que el problema puede estar en el nivel del sistema de archivos.Nota: No utilice
ls
para buscar si un directorio está vacío, perols -a
.El directorio aún puede ser utilizado por otro proceso (incluso si es el cwd de algún proceso). En mi humilde opinión, es por eso que todavía "existe" pero puede producir errores, por ejemplo, con
ls
;lsof
puede darle alguna información, pero con NFS, necesita encontrar qué máquina la usa. Especialmente con NFS, esto puede producir errores extraños.ls -a
en el directorio principal podría mostrarle.nfs*
archivos / directorios en algunos casos.Cuando tengas:
Sospecho que el archivo todavía existe en la tabla de directorio debido al almacenamiento en caché de NFS y / o porque es utilizado por otro proceso, pero sin la información asociada. Cuando
ls
intenta obtener información sobre el archivo en sí, recibe un error ya que el archivo en sí ya no existe (solo está en la tabla del directorio), de ahí el error que se muestra. Luegols
genera el nombre del archivo porque está en la tabla de directorio. El hecho de que tenga signos de interrogación en un caso, pero no en el otro, se debe a un error de visualización enls
mi humilde opinión (no relacionado con su problema).fuente
He probado personalmente usando
find
la-exec
directiva de:La carpeta se creó y eliminó correctamente.
Como señaló @Igeorget , hay un método aún más simple si tienes GNU
find
:También probé este comando y funciona correctamente
fuente
-delete
opción.He tenido el mismo problema, creo. He visto el problema anteriormente con un nombre de archivo de
☃
.ls
en este caso mostraba el archivo comoâ??
, pero pude eliminarlo conrm ☃
.Esto me llevó a la siguiente forma de convertir el nombre incorrecto al correcto:
Primero obtenga los bytes del nombre de archivo:
Luego decodifique estos bytes como UTF-8, para obtener los puntos de código unicode, utilizando la entrada hexadecimal de este sitio web, por ejemplo: http://software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder
Observe que todos estos están debajo del límite de bytes. Obtenemos los siguientes bytes:
Si tratamos esta secuencia en UTF-8 obtenemos:
Y, por lo tanto, su nombre de archivo es:,
mikea⁄cnt
con una barra diagonal en lugar de una normal hacia adelante. Ahora puede pasar este nombre armdir
.fuente
Después de obtener el código hexadecimal correcto del nombre de archivo / carpeta (usando el método que uno considere apropiado, puedo elegir
ls --show-control-chars | xxd
), se debe usar una construcción especial para abordar dichos caracteres cuando se ejecuta bajo bash:De lo contrario, las barras invertidas se tratan como barras invertidas de vainilla.
fuente
ls
incluye nueva línea en los datos de salida y el "cnt" está duplicado. ¿Quizás pueda intentar copiar y pegar directamente la línea en mi respuesta y ver si es efectiva?LC_*
yLANG
las variables env), y montar NFS sin ninguna opción de conjunto de caracteres¿Has intentado usar
rm -rf ./mikeaâcnt
orm -rf "./mikeaâcnt"
o una ruta absoluta? También en lugar derm
intentarlormdir ./mikeaâcnt
.fuente
mikeaâcnt
no parecen ser el nombre del archivo, sino lo que sels
muestra, vea la tercera edición¿Has intentado obtener el inodo de ese archivo con
stat
:Eso debería darle el número de inodo (y otros datos), y luego podría intentar eliminarlo.
fuente
stat
behavour,Tuve problemas similares. ¿Tienes Gnome, KDE o algún tipo de Xwindow DM ?. Si abre el archivo broser y elimina el archivo de allí.
Deberia de funcionar.
Me gustaría ver una solución desde la línea de comandos, pero en mi caso y después de perder mucho tiempo tratando de descubrir cómo eliminarla de la línea de comando, descubrí que era tan simple como eliminar cualquier otro archivo de nautilus o cualquier otro explorador de archivos (la verdad es que solo lo he intentado con nautilus).
fuente