Par exemple, j'ai un fichier myold_file
. Ensuite, je ln
crée un lien en tant que mylink
:
ln myold_file mylink
Ensuite, même en utilisant ls -a
, je ne peux pas dire lequel est l'ancien.
Y a-t-il un moyen de le savoir?
Par exemple, j'ai un fichier myold_file
. Ensuite, je ln
crée un lien en tant que mylink
:
ln myold_file mylink
Ensuite, même en utilisant ls -a
, je ne peux pas dire lequel est l'ancien.
Y a-t-il un moyen de le savoir?
Réponses:
Vous ne pouvez pas, car ils sont littéralement le même fichier, accessible uniquement par des chemins différents. Le premier n'a pas de statut particulier.
.bashrc
est un fichier contenant ...", lorsque nous entendons, "le chemin relatif .bashrc
fait référence à un fichier contenant ...", il s'agit d'un mélange courant de catégories et nous devons comprendre que chaque fois que l'on fait référence à un chemin ou une entrée de répertoire "étant" un fichier, nous voulons dire le fichier auquel il fait référence. Avec cette compréhension, deux liens durs peuvent "être" le même fichier. Rejetant cette convention en faveur du langage formel, ils ne peuvent pas. Les deux positions ont leur place :-)
Il n'y a pas de moyen direct et propre (fiable) de le faire. Mais dans des circonstances appropriées, cela peut être possible (ou du moins probable). Le problème est qu'il y a deux liens durs mais un seul fichier. Les temps de modification, de modification et (éventuellement) de création ne sont stockés que pour les fichiers (inodes), mais pas pour les entrées de répertoire (les liens physiques). Ainsi, les informations que vous souhaitez ne peuvent être extraites que des effets secondaires qui peuvent facilement être détruits par des opérations qui ne sont pas liées au fichier. Et vous ne pouvez même pas voir s'il a été détruit. Vous ne pouvez le savoir à partir des circonstances opérationnelles que si vous en êtes précisément conscient.
La création d'un lien dur est une opération d'écriture dans le répertoire qui contient le lien. Ainsi, il met à jour le répertoire mtime
. Donc si
les liens sont dans des répertoires différents
et vous savez qu'aucun de ces répertoires n'a été modifié (fichier ajouté, supprimé, renommé ou changement de métadonnées de fichier) après la création du deuxième lien physique, vous pouvez simplement comparer le mtime
s des répertoires.
Cas particulier: Si l'un des répertoires comporte un mtime
précédant le fichier (l'inode) mtime
et que vous pouvez être raisonnablement sûr que le fichier n'a pas été écrit après un court instant après sa création, le lien de ce répertoire est le plus ancien.
Si les liens se trouvent dans le même répertoire (ce qui semble être le cas dans votre question), la situation empire. Ensuite, vous pouvez utiliser
ls -lU
afin d’obtenir une impression de l’ordre dans lequel les entrées ont été créées. Cet ordre n'est pas nécessairement correct car les entrées peuvent être supprimées, de sorte que de nouvelles entrées sont créées au milieu de la liste des répertoires. Et comme Gilles l'a souligné, cela ne fonctionne pas du tout avec les systèmes de fichiers les plus récents.
ls -lU
astuce ne fonctionnera pas sur les systèmes de fichiers modernes (ext4, btrfs, zfs), car les entrées ne s'affichent pas du tout dans l'ordre de création.
rm myold_file
alors mylink
, elles existeraient toujours et fonctionneraient parfaitement, car il s'agit d'une entrée tout aussi bonne faisant référence au même inode sous-jacent. Ce n'est que lorsque les deux ont été supprimés que le système peut supprimer l'inode. Une fois que la liaison matérielle a été utilisée pour créer deux entrées de système de fichiers faisant référence au même fichier, elles sont équivalentes. (Notez que "fichier" signifie ici "un inode qui contient les données d'un fichier, par opposition à un répertoire.) Voir: en.wikipedia.org/wiki/Inode
Si vous vous fiez à la dernière heure de modification des répertoires et que vous ne savez pas comment et quand ces répertoires sont modifiés, compter sur mtime vous conduira à vous tromper un certain pourcentage du temps. Le problème ici est que le fichier est représenté dans le système de fichiers par un inode, pas par une entrée de répertoire. L'entrée de répertoire (nom de fichier) pointe vers l'inode, pas le fichier.
Je pense que je me demanderais peut-être pourquoi j'ai besoin de savoir quelle entrée de répertoire est la plus ancienne et comment éviter de devoir le savoir.
Je pense que cette question est (tout à fait raisonnablement) erronée quant à ce qu'est réellement un lien solide. Je pense cependant que la réponse directe la plus correcte est «ils sont tous les deux» .
Les systèmes de fichiers Unix stockent normalement le contenu actuel des fichiers et les données dans des i-nœuds, ceux-ci n’ayant aucun chemin, ceux-ci ont alors une relation plusieurs à un avec ces i-nœuds. Prenons comme analogie une personne qui porte deux noms, Bob et Joe. On ne peut pas dire que Bob est plus âgé que Joe ou vice-versa, ce ne sont que des noms pour la même personne.
Si vous souhaitez conserver le concept de fichier «original» et un nouveau fichier, vous recherchez probablement un lien symbolique. Il s’agit plutôt d’un alias, il s’agit simplement d’une instruction donnée au système d’exploitation de étaient à un autre sans changer la structure de fichier en dessous. (Vous pouvez les créer avec "ln -s file link".
Le noeud de la réponse donnée par plusieurs autres personnes ci-dessus est que le nom de chaque fichier est un lien physique vers un fichier. Il n'y a pas de véritable original, mais peut-être même un premier.
Pensez à un répertoire comme une table qui répertorie les noms de fichiers et les numéros d'inode.
Chaque lien physique, y compris le premier, est une entrée dans un répertoire qui attribue un "nom de fichier" au numéro d'inode, afin que vous puissiez accéder au fichier par ce nom.
Le fichier est un ensemble de blocs sur disque, gérés et suivis par des métadonnées stockées dans un inode. Un fichier a un numéro d'inode.
L'accès aux données d'un fichier via le nom de fichier est un processus en trois étapes: Le nom du fichier est recherché dans le répertoire pour obtenir le numéro d'inode. Il est ensuite fait référence à l'inode pour trouver le ou les blocs de disque pertinents contenant les données. Enfin, ces blocs sont lus / écrits.
En résumé, voici ce qu’il faut retenir: Il n’ya absolument aucune différence entre l’accès au contenu du fichier à l’aide du premier ("original") ou de tout lien créé ultérieurement.
ls > a; ln a b; rm a; ln b c
, lequel est "plus original" que l'autre?a
est parti, il vous resteb
etc
...