Comment Linux gère-t-il une commande de déplacement

12

Comment Linux gère-t-il une commande de déplacement sous le capot?

Disons que je déplace ma maison dir

/home/me

et je le déplace dans un autre répertoire

/home/foo/me

Comment tous les chemins de fichiers et de répertoires sont-ils memodifiés? Je sais que mon Desktoprépertoire sous meest maintenant /home/foo/me/Desktopaussi bien, Documents /home/foo/me/Documentsmais le système de fichiers met-il explicitement à jour chaque chemin sous mepour refléter le changement? Cela ne semble pas très efficace et ce n'est probablement pas ça.

Où puis-je obtenir plus d'informations à ce sujet?

Jeff
la source
5
À propos de l'efficacité: non, ce ne serait pas efficace. Lorsque vous déplacez des données vers un autre répertoire, les données ne sont pas réellement lues à un endroit et écrites à un autre. Un système de fichiers contient un ensemble de pointeurs vers des blocs de données. Dans le cas d'un déplacement, seuls les pointeurs sont mis à jour.
Jos
Ah, c'est probablement ce que jeff voulait dire ...
Jacob Vlijm
@Jos D'où vient la fragmentation, n'est-ce pas?
zero298
3
@ zero298 Non, la fragmentation est généralement une entité complètement différente et sans rapport - la fragmentation ne concerne pas le contenu de la structure des dossiers, mais le contenu d'un seul fichier dispersé sur les plateaux de disques physiques (au lieu d'être une seule ligne continue), ce qui réduit la lecture / écriture des performances de ces fichiers. Le contenu des arborescences de dossiers volumineux / profonds / ramifiés n'est généralement pas censé être continu et déplacé de cette façon.
Peteris

Réponses:

21

Pour comprendre comment il déplace les dossiers, vous devrez peut-être comprendre un peu le système de fichiers sous Linux. Tous les fichiers et dossiers sont stockés dans le cadre d'une structure de données appelée " inode ". Chaque fichier a un numéro d'inode, tout comme les dossiers.

Pour afficher l'inode de votre dossier, utilisez la commande ls -ial foldername. La première colonne indique le numéro d'inode du fichier. Pour chaque dossier, il existe deux noms uniques .et ..représentant respectivement le répertoire qui lui est propre et le répertoire parent.

Vous pouvez essayer de faire une expérience pour déplacer un répertoire (par exemple, / home / me / source) avec des sous-répertoires et des fichiers vers un autre répertoire (par exemple / home / me / quelque part / else). Le numéro d'inode de / home / me / source et tout son contenu reste le même avant et après le déplacement. La seule différence est le numéro d'inode de .., qui partage à l'origine le numéro d'inode de / home / me et devient maintenant le numéro d'inode de / home / me / quelque part / autre. En termes simples, Linux met à jour le lien vers le répertoire source , puis c'est fait.

Le contenu du disque dur n'est pas modifié de toute façon, seul l'index d'inode est mis à jour lorsque le dossier est déplacé. Ce n'est bien sûr pas le cas si vous déplacez le dossier vers un autre emplacement physique.

Kenneth L
la source
3
Oui, tant que le déplacement ne dépasse pas les limites du système de fichiers.
kojiro
3

Si vous êtes intéressé par le fonctionnement de programmes tels que mvet cp, rappelez-vous qu'ils sont open source et vous pouvez obtenir l'explication la plus précise en lisant le code. Voici des liens vers tous les utilitaires de base. Plus précisément, vous pouvez trouver mv ici

Hugo Buff
la source
6
you can get the most accurate explanation by reading through the code.Je ne suis pas d'accord; Pendant longtemps, je n'avais absolument aucune expérience avec C, et même maintenant je ne le préfère pas. De plus, le code source est souvent optimisé et contient plus de cas marginaux que nécessaire. Une explication symbolique aide souvent plus.
Shelvacu
1
@shelvacu "contient plus de cas marginaux que nécessaire". Un code robuste gère tous les cas de bord qui peuvent être présents. Cependant, il est vrai que la présentation de tous les cas marginaux dans la première explication d'un concept peut ne pas être nécessaire.
OregonTrail
@OregonTrail Désolé, c'est ce que je voulais dire, le code a plus de cas
marginaux,
Je suis content que ce soit votre sentiment d'origine, mais vous sembliez toujours avoir manqué mon accent sur les " poignées ". Code bien écrit ne pas avoir des cas de pointe, il gère les cas de pointe. ;) Je sais que tu viens du bon endroit ici, mais tu devrais faire attention à tes verbes.
OregonTrail