Eliminar directorio indirectamente dentro de sí mismo

9

Tengo un directorio dentro de sí mismo. ¿Cómo lo elimino?

~/.local/share/Trash/files$ ls devices/
reg-dummy
~/.local/share/Trash/files$ ls devices/reg-dummy/
subsystem
~/.local/share/Trash/files$ ls devices/reg-dummy/subsystem/
devices

también

~/.local/share/Trash/files$ find devices/ | head -n 20
devices/
devices/reg-dummy
devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy

Además, aunque mi cerebro no puede resolver el problema de detención, parece que sudo rm -rf devicescontinúa para siempre sin producir resultados.

~/.local/share/Trash/files$ sudo rm -rf devices
^C~/.local/share/Trash/files$

Lo mismo para perl -e 'use File::Path qw(remove_tree); remove_tree("$ENV{HOME}/.local/share/Trash/files/devices")'. Lo mismo para du -s devices/. Lo mismo para du -sch ~/.local/share/Trash/ otros comandos

$ cd ~/.local/share/Trash/files/devices/reg-dummy/subsystem/devices/
$ ls -ldi 
8131921 drwxr-xr-x 3 theking theking 4096 Mar 17 19:43 .
$ cd reg-dummy/subsystem/devices/
$ ls -dli
8131926 drwxr-xr-x 3 theking theking 4096 Mar 17 19:43 .


$ find .local/share/Trash/files/ -maxdepth 1 -delete
find: cannot delete `.local/share/Trash/files/devices': Directory not empty
find: cannot delete `.local/share/Trash/files/': Directory not empty

¡No quiero que se quede en mi basura para siempre!

Nota: Estaba haciendo una copia de seguridad cruda de una computadora simplemente usando scp, pero me quedé sin espacio y luego sucedió esto.

PyRulez
fuente
Muéstrenos el comando con el que intentó eliminarlo y el error que le dio. ¿Qué rm -rf deviceshacer?
terdon
Agregue también la salida de ls -dli devicesandls -dli devices/reg-dummy/subsystem/devices/
terdon el
3
El primer comando debería haber sido ls -ldi devices, no device. Estoy tratando de ver si estos son realmente enlaces duros (el mismo inodo). Sin embargo, tenga en cuenta que si se trata de un directorio grande, rm -rfllevará mucho tiempo pero eventualmente funcionará. Si el problema aquí son los enlaces circulares, recibirá un mensaje de error sobre la recursión infinita. Si no hay un mensaje de error, simplemente deje que rm -rfsiga su curso.
terdon
77
@terdon: ¿Pensé que Linux (Ubuntu, al menos) no permite directorios vinculados?
saiarcot895
2
¿Solo estoy suponiendo que lo intentaste con el botón de "papelera vacía" incorporado de nautilus? (tal vez pensaron en ese tipo de cosas al escribir nautilus ^^)
MrVaykadji

Respuestas:

3

La salida de ls -ldimostrará el número de inodo del directorio. Si el directorio dentro del directorio realmente tiene el mismo número de inodo que su antecesor, en lugar de solo el mismo nombre, entonces su sistema de archivos está dañado y tendrá que arrancar en modo de rescate y fsck.

psusi
fuente
1

Todavía creo que rm -rffuncionará si le das suficiente tiempo, pero si no, uno o ambos deberían:

perl -e 'use File::Path qw(remove_tree); 
        remove_tree("$ENV{HOME}/.local/share/Trash/files/devices")'`

 

find .local/share/Trash/files/ -delete

Puede asegurarse de que algo está sucediendo si usa rm -rfv ~/.local/share/Trash/files/devicesal menos eso le permitirá saber que los archivos se están eliminando.

De todos modos, esto no puede ser un problema de enlace rígido (a pesar de mi comentario muy equivocado) porque los directorios no pueden vincularse en Linux. En general, cuando tiene una recursión infinita, como puede suceder con los enlaces suaves, recibirá un mensaje al respecto, que no parece suceder.

La otra posibilidad que se me ocurre es que la carpeta Papelera es un sistema extraño propio. Realmente no sé cómo funciona, nunca lo uso. Sin embargo, es posible que tenga más suerte eliminando los archivos de nivel superior directamente en lugar de apuntar al directorio problemático:

rm -rf ~/.local/share/Trash/* 

También debe intentar vaciar la carpeta Papelera de la GUI, simplemente seleccione Papelera y haga clic en "Vaciar Papelera", vea si eso funciona.

terdon
fuente
Ambos fallaron. Pregunta revisada.
PyRulez
@PyRulez ¿qué tan grande es este directorio? Ni el script perl ni el rmproducirán ningún resultado. ¿Cuánto tiempo corrieron? También actualicé el findcomando, el anterior estaba equivocado, lo siento. Echa un vistazo a la respuesta actualizada. Finalmente, estamos trabajando ciegos aquí. Actualice su pregunta con el resultado de ls -ldónde ha utilizado ls, también muestre el resultado du -sch ~/.local/share/Trash/para que sepamos el tamaño.
terdon
No pude encontrar el tamaño.
PyRulez
@PyRulez intente du -sch ~/.local/share/Trash/eso le dará el tamaño. Y agregue todas las cosas que los diversos comentarios han pedido, son necesarias para que podamos entender lo que está sucediendo.
terdon
@tedron he estado.
PyRulez
0

(Estoy seguro de que esto funcionará y como voy a viajar ahora, lo dejaré como una respuesta que puedo eliminar en el futuro si no funciona).

  1. Primero, para estar seguro, corre

    find ~/.local/share/Trash/files/devices/ -exec echo {} \;
    
  2. En segundo lugar, si el resultado de "1" no muestra ningún archivo importante, ejecute

    find ~/.local/share/Trash/files/devices/ -exec rm {} \;
    
  3. El paso final sería

    find ~/.local/share/Trash/files/devices/ -empty -type d -delete
    
desgua
fuente