GNU/Linux >> Tutoriels Linux >  >> Linux

Comment Rm -r procède-t-il à la suppression récursive ? Dans quel ordre?

Existe-t-il un ordre d'opérations pour rm ? J'ai exécuté rm sur un grand répertoire et je suis curieux de savoir où je devrais regarder pour voir ce qui aurait pu être supprimé. Est-ce que rm travailler d'abord sur les fichiers, puis sur les répertoires ? Ou est-ce basé sur certaines informations de la table d'inodes ?

Spécifications :rm du système GNU coreutils 8.22
 :Arch Linux s'exécutant sur un système de fichiers beagleboneblack
fonctionnant sur un disque dur Seagate externe (ext4) utilisant USB 2.0.

Antécédents :

J'effectuais un nettoyage de répertoire et effectué

cp -r A/ B/ C/ Dest/

Sans le vouloir, j'ai suivi cela avec

rm -r A/ B/ C/ Dest/

quand je voulais simplement jouer

rm -r A/ B/ C/

J'ai attrapé ceci et appuyé sur Ctrl +C trop longtemps ne s'était écoulé. Plus précisément, c'était <3 secondes car j'utilisais le time commande en conjonction avec rm &cp . Je suis entré et j'ai examiné Dest/ s'attendant à ce qu'il soit inexistant, mais voilà, il était entier et apparu pour ne pas être affecté. C'est un peu surprenant car A/ B/ C/ étaient assez petits. Peut-être 100 à 200 Mo au total. Dest/ cependant, est juste timide de 1 To. Exécution d'un ls sur Dest/ a montré qu'il y avait à la fois des fichiers et des répertoires aux deux extrémités de l'alphabet (par exemple AFile.txt …. …. Zoo.txt ).

Ai-je eu de la chance et annulé le rm avant qu'il ne fasse des ravages sur mon répertoire Dest/ ? Est rm vraiment si lent (heureusement !) ?

Si non, comment rm supprimer récursivement des choses de manière à ce que je puisse deviner ce qui aurait pu être perdu ?

Je ne m'attends pas vraiment à récupérer ce que j'aurais pu perdre, je suis juste curieux de savoir ce qui a potentiellement été emporté.

Réponse acceptée :

rm -r travaille tour à tour sur chacun de ses arguments. Si un argument est un répertoire, il liste le répertoire (avec le opendir et readdir fonctions ou une méthode équivalente), et opère sur chaque entrée à tour de rôle. Si une entrée est un répertoire, il explore cette entrée de manière récursive.

C'est exactement la même méthode que les autres applications utilisent pour parcourir les répertoires de manière récursive — find , ls -Rf , etc.

L'ordre de passage est imprévisible. Sur la plupart des systèmes de fichiers, l'ordre est reproductible tant qu'aucun fichier n'est ajouté, supprimé ou renommé dans le répertoire (l'ordre pourrait en théorie être complètement aléatoire et changer à chaque fois, mais je ne peux pas penser à un système de fichiers où cela se produit). Sur quelques systèmes de fichiers, l'ordre peut en général être déduit des noms de fichiers ou de l'ordre dans lequel les fichiers ont été créés ou une combinaison des deux, mais vous devez connaître les détails fins du système de fichiers, et cela peut varier selon la version du pilote. L'ordre de parcours n'est pas quelque chose sur lequel vous pouvez compter.

Connexe :Optimisation de la taille du secteur logique pour la taille du secteur physique 4096 HDD ?

Notez que ls ou echo * trier les fichiers dans l'ordre lexicographique de leurs noms. find et ls -f ne pas trier.

La seule chose sur laquelle vous pouvez compter est que les arguments sont traités dans l'ordre. Donc si C/ était encore partiellement là, cela signifierait que Dest/ était intacte. Si C/ est parti, vous pouvez avoir une idée de l'endroit où les fichiers ont été supprimés dans Dest/ en vérifiant les heures de modification du répertoire et en les comparant avec l'heure C/ a été supprimé ou l'heure à laquelle la copie s'est terminée. Le premier fichier à supprimer pourrait être un fichier directement dans Dest/ ou quelque part au plus profond de la hiérarchie selon que la première entrée dans Dest/ ce rm arrivé à traverser était un répertoire ou non.

La vitesse de rm est principalement une question de combien de fichiers il y a à supprimer. Il faut un fichier très volumineux pour avoir un impact notable sur le temps de suppression. Le gros du travail consiste à supprimer tour à tour chaque entrée du répertoire. Les données du fichier ne sont pas effacées, effacer le contenu d'un fichier nécessite seulement de marquer les blocs qu'il utilisait comme libres, ce qui est relativement rapide.


Linux
  1. Qu'est-ce qu'un serveur Web et comment fonctionne un serveur Web ?

  2. Comment savoir ce que fait une commande Linux

  3. Que fait "lc_all=c" ?

  4. Qu'est-ce que Echo $ ? Faire??

  5. Qu'est-ce que le DNS et comment ça marche ?

Qu'est-ce que Hadoop Mapreduce et comment ça marche

Commande de fichier Linux :que fait-elle et comment l'utiliser

Qu'est-ce que Docker ? Comment ça marche?

Qu'est-ce que la commande source sous Linux et comment ça marche ?

Comment fonctionne un équilibreur de charge ? Qu'est-ce que l'équilibrage de charge ?

Comment ça marche ? Que fait rm ?