Elimina indirettamente la directory all'interno di se stessa


9

Ho una directory dentro di sé. Come 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

Anche

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

Inoltre, anche se il mio cervello non è in grado di risolvere il problema di arresto, sembra che sudo rm -rf devicesvada avanti per sempre senza produrre risultati.

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

Stessa cosa per perl -e 'use File::Path qw(remove_tree); remove_tree("$ENV{HOME}/.local/share/Trash/files/devices")'. Stessa cosa per du -s devices/. Stessa cosa per du -sch ~/.local/share/Trash/ altri comandi

$ 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

Non lo voglio bloccato nella mia immondizia per sempre!

Nota: stavo semplicemente eseguendo un backup approssimativo di un computer semplicemente usando scp, ma ho esaurito lo spazio e quindi è successo.


Mostraci il comando con cui hai provato a eliminarlo e l'errore che ti ha dato. Cosa fa rm -rf devices?
terdon,

Per favore, aggiungi anche l'output di ls -dli devicesels -dli devices/reg-dummy/subsystem/devices/
terdon il

3
Il primo comando avrebbe dovuto essere ls -ldi devices, no device. Sto cercando di vedere se si tratta effettivamente di collegamenti reali (lo stesso inode). Tuttavia, tenere presente che se si tratta di una directory di grandi dimensioni, rm -rfrichiederà molto tempo ma alla fine funzionerà. Se il problema qui è rappresentato dai collegamenti circolari, verrà visualizzato un messaggio di errore relativo alla ricorsione infinita. Se non è presente alcun messaggio di errore, basta rm -rfavviare il suo corso.
terdon,

7
@terdon: pensavo che Linux (almeno Ubuntu) non consentisse le directory hard-linkate?
saiarcot895,

2
Suppongo che tu abbia provato con il pulsante "Svuota cestino" incorporato di Nautilus? (forse hanno pensato a quel tipo di cose quando hanno scritto nautilus ^^)
MrVaykadji

Risposte:


3

L'output di ls -ldimostrerà il numero di inode della directory. Se la directory all'interno della directory ha davvero lo stesso numero di inode del suo antenato, piuttosto che solo lo stesso nome, allora il tuo filesystem è corrotto e dovrai avviarlo in modalità di salvataggio e cercarlo.


1

Penso ancora che rm -rffunzionerà se gli dai abbastanza tempo, ma in caso contrario, uno o entrambi questi dovrebbero:

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

 

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

Puoi assicurarti che qualcosa accada se lo usi rm -rfv ~/.local/share/Trash/files/devicesalmeno per farti sapere che i file vengono eliminati.

Comunque, questo non può essere un problema di hardlink (nonostante il mio commento molto sbagliato) perché le directory non possono essere hardlinked sotto Linux. In generale, quando si ha una ricorsione infinita, come può succedere con i softlink, si otterrà un messaggio in tal senso, che non sembra accadere.

L'altra possibilità che mi viene in mente è che la cartella Cestino è uno strano sistema a sé stante. Non so davvero come funzioni, non lo uso mai. Tuttavia, potresti avere maggiore fortuna eliminando direttamente i file di livello superiore invece di indirizzare la directory problematica:

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

Dovresti anche provare a svuotare la cartella Cestino dalla GUI, basta selezionare Cestino e fare clic su "Svuota Cestino", per vedere se funziona.


Entrambi fallirono. Domanda rivista.
PyRulez,

@PyRulez quanto è grande questa directory? Né lo script perl né il rmprodurranno alcun output. Per quanto tempo sono scappati? Ho anche aggiornato il findcomando, quello precedente era sbagliato, scusa. Dai un'occhiata alla risposta aggiornata. Finalmente, stiamo lavorando ciechi qui. Aggiorna la tua domanda con l'output di ls -ldove hai utilizzato ls, mostra anche il risultato in du -sch ~/.local/share/Trash/modo che conosciamo le dimensioni.
terdon,

Non sono riuscito a trovare la dimensione.
PyRulez,

Prova @PyRulez du -sch ~/.local/share/Trash/che ti darà la dimensione. E per favore aggiungi tutte le cose che i vari commenti hanno richiesto, sono necessari per capire cosa sta succedendo.
terdon,

@tedron sono stato.
PyRulez,

0

(Sono sicuro che funzionerà e dato che viaggerò adesso, lascerò questo come risposta che posso cancellare in futuro se non funziona.)

  1. Innanzitutto, per sicurezza, corri

    find ~/.local/share/Trash/files/devices/ -exec echo {} \;
    
  2. In secondo luogo, se l'output di "1" non mostrava alcun file importante, eseguire

    find ~/.local/share/Trash/files/devices/ -exec rm {} \;
    
  3. Il passo finale sarebbe

    find ~/.local/share/Trash/files/devices/ -empty -type d -delete
    
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.