Excluir diretório indiretamente dentro de si

9

Eu tenho um diretório dentro de si. Como faço para excluí-lo.

~/.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

Além disso

~/.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

Além disso, embora meu cérebro não consiga resolver o problema da parada, parece que sudo rm -rf devicescontinua para sempre sem produzir resultados.

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

A mesma coisa para perl -e 'use File::Path qw(remove_tree); remove_tree("$ENV{HOME}/.local/share/Trash/files/devices")'. A mesma coisa para du -s devices/. A mesma coisa para du -sch ~/.local/share/Trash/ outros 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

Não quero que fique preso no meu lixo para sempre!

Nota: Eu estava fazendo um backup bruto de um computador simplesmente usando scp, mas fiquei sem espaço e isso aconteceu.

PyRulez
fonte
Por favor, mostre-nos o comando com o qual você tentou excluí-lo e o erro que ele forneceu. O que rm -rf devicesfaz?
terdon
Por favor, adicione também a saída de ls -dli devicesels -dli devices/reg-dummy/subsystem/devices/
terdon
3
O primeiro comando deveria ter sido ls -ldi devices, não device. Estou tentando ver se esses são realmente links físicos (o mesmo inode). No entanto, esteja ciente de que, se este for um diretório grande, rm -rflevará muito tempo, mas eventualmente funcionará. Se o problema aqui for links circulares, você receberá uma mensagem de erro sobre recursão infinita. Se não houver mensagem de erro, basta rm -rfseguir seu curso.
terdon
7
@terdon: Eu pensei que o Linux (Ubuntu, pelo menos) não permite diretórios vinculados?
saiarcot895
2
Só suponho que você tenha tentado com o botão "lixo vazio" interno do nautilus? (talvez eles pensaram que tipo de coisas ao escrever ^^ Nautilus)
MrVaykadji

Respostas:

3

A saída de ls -ldimostrará o número do inode do diretório. Se o diretório dentro do diretório realmente tiver o mesmo número de inode que seu ancestral, em vez de apenas o mesmo nome, seu sistema de arquivos está corrompido e você precisará inicializar no modo de recuperação e fsck.

psusi
fonte
1

Eu ainda acho que rm -rffuncionará se você der tempo suficiente, mas se não, um ou os dois devem:

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

 

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

Você pode garantir que algo esteja acontecendo se você usar rm -rfv ~/.local/share/Trash/files/devicespelo menos isso para saber que os arquivos estão sendo excluídos.

De qualquer forma, isso não pode ser um problema de hardlink (apesar do meu comentário muito errado), porque os diretórios não podem ser hardlinked no Linux. Em geral, quando você tem uma recursão infinita, como pode acontecer com os softlinks, você receberá uma mensagem nesse sentido, que parece não acontecer.

A outra possibilidade em que posso pensar é que a pasta Lixeira é um sistema estranho. Realmente não sei como funciona, nunca o uso. No entanto, é melhor você excluir os arquivos de nível superior diretamente, em vez de direcionar o diretório problemático:

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

Você também deve tentar esvaziar a pasta Lixeira da GUI, basta selecionar Lixeira e clicar em "Esvaziar Lixeira", para ver se isso funciona.

Terdon
fonte
Ambos falharam. Pergunta revisada.
PyRulez
@PyRulez quão grande é este diretório? Nem o script perl nem o rmproduzirão qualquer saída. Por quanto tempo eles correram? Eu também atualizei o findcomando, o anterior estava errado, desculpe. Dê uma olhada na resposta atualizada. Finalmente, estamos trabalhando cegos aqui. Atualize sua pergunta com a saída de ls -londe você usou ls, também mostre o resultado du -sch ~/.local/share/Trash/para sabermos o tamanho.
terdon
Não consegui encontrar o tamanho.
PyRulez
@PyRulez tente du -sch ~/.local/share/Trash/que lhe dará o tamanho. Adicione todas as informações solicitadas pelos vários comentários, necessárias para que possamos entender o que está acontecendo.
terdon
@tedron eu estive.
PyRulez
0

(Estou confiante de que isso funcionará e, como vou viajar agora, deixarei isso como uma resposta que posso excluir no futuro, se não funcionar.)

  1. Primeiro, para estar seguro, corra

    find ~/.local/share/Trash/files/devices/ -exec echo {} \;
    
  2. Segundo, se a saída "1" não mostrar nenhum arquivo importante, execute

    find ~/.local/share/Trash/files/devices/ -exec rm {} \;
    
  3. O passo final seria

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