Supprimer le répertoire indirectement à l'intérieur de lui-même

9

J'ai un répertoire en lui-même. Comment puis-je le supprimer.

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

Aussi

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

De plus, bien que mon cerveau ne puisse pas résoudre le problème d'arrêt, il semble que cela sudo rm -rf devicescontinue indéfiniment sans produire de sortie.

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

Même chose pour perl -e 'use File::Path qw(remove_tree); remove_tree("$ENV{HOME}/.local/share/Trash/files/devices")'. Même chose pour du -s devices/. Même chose pour les du -sch ~/.local/share/Trash/ autres commandes

$ 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

Je ne veux pas qu'il reste dans ma poubelle pour toujours!

Remarque: je faisais une sauvegarde grossière d'un ordinateur en utilisant simplement scp, mais j'ai manqué d'espace, puis cela s'est produit.

PyRulez
la source
Veuillez nous montrer la commande avec laquelle vous avez essayé de le supprimer et l'erreur qu'elle vous a donnée. Que fait rm -rf devices-il?
terdon
Veuillez également ajouter la sortie de ls -dli devicesandls -dli devices/reg-dummy/subsystem/devices/
terdon
3
La première commande aurait dû être ls -ldi devices, non device. J'essaye de voir si ce sont réellement des liens durs (le même inode). Cependant, sachez que s'il s'agit d'un grand répertoire, rm -rfcela prendra beaucoup de temps mais finira par fonctionner. Si le problème est lié aux liens circulaires, vous obtiendrez un message d'erreur sur la récursion infinie. S'il n'y a pas de message d'erreur, laissez simplement rm -rfsuivre son cours.
terdon
7
@terdon: Je pensais que Linux (Ubuntu, au moins) n'autorise pas les répertoires liés en dur?
saiarcot895
2
Je suppose juste que vous avez essayé avec le bouton "vide corbeille" intégré à Nautilus? (peut-être qu'ils ont pensé à ce genre de choses en écrivant nautilus ^^)
MrVaykadji

Réponses:

3

La sortie de ls -ldiaffichera le numéro d'inode du répertoire. Si le répertoire dans le répertoire a vraiment le même numéro d'inode que son ancêtre, plutôt que juste le même nom, alors votre système de fichiers est corrompu et vous devrez démarrer en mode de secours et le fsck.

psusi
la source
1

Je pense toujours que cela rm -rffonctionnera si vous lui donnez suffisamment de temps, mais sinon, l'un ou les deux devraient:

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

 

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

Vous pouvez vous assurer que quelque chose se passe si vous utilisez rm -rfv ~/.local/share/Trash/files/devicesau moins cela vous permettra de savoir que les fichiers sont supprimés.

Quoi qu'il en soit, cela ne peut pas être un problème de lien dur (malgré mon très mauvais commentaire) car les répertoires ne peuvent pas être liés sous Linux. En général, lorsque vous avez une récursion infinie, comme cela peut arriver avec les liens logiciels, vous obtiendrez un message à cet effet, qui ne semble pas se produire.

L'autre possibilité à laquelle je peux penser est que le dossier Corbeille est un système étrange qui lui est propre. Je ne sais pas vraiment comment ça marche, je ne l'utilise jamais. Cependant, vous pourriez avoir plus de chance de supprimer les fichiers de niveau supérieur directement au lieu de cibler le répertoire problématique:

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

Vous devriez également essayer de vider le dossier Corbeille de l'interface graphique, sélectionnez simplement Corbeille et cliquez sur "Vider la corbeille", voir si cela fonctionne.

terdon
la source
Ils échouèrent tous les deux. Question révisée.
PyRulez
@PyRulez quelle est la taille de ce répertoire? Ni le script perl ni le rmne produiront de sortie. Combien de temps ont-ils couru? J'ai également mis à jour la findcommande, la précédente était fausse, désolé. Jetez un œil à la réponse mise à jour. Enfin, nous travaillons aveugles ici. Veuillez mettre à jour votre question avec la sortie de l' ls -lendroit où vous l'avez utilisé ls, montrez également le résultat de du -sch ~/.local/share/Trash/sorte que nous connaissions la taille.
terdon
Je n'ai pas trouvé la taille.
PyRulez
Essayez @PyRulez du -sch ~/.local/share/Trash/qui vous donnera la taille. Et veuillez ajouter tout ce que les divers commentaires ont demandé, ils sont nécessaires pour que nous puissions comprendre ce qui se passe.
terdon
@tedron je l'ai été.
PyRulez
0

(Je suis convaincu que cela fonctionnera et comme je vais voyager en ce moment, je laisserai cela comme une réponse que je pourrai supprimer à l'avenir si cela ne fonctionne pas.)

  1. Tout d'abord, pour être en sécurité, exécutez

    find ~/.local/share/Trash/files/devices/ -exec echo {} \;
    
  2. Deuxièmement, si la sortie de "1" n'affiche aucun fichier important, exécutez

    find ~/.local/share/Trash/files/devices/ -exec rm {} \;
    
  3. La dernière étape serait

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