Il est facile de convertir un lien symbolique en lien physique avec ln -f
(exemple)
Il serait également facile de convertir un lien physique (noms de fichiers link
et original
) retour à un lien symbolique vers link->original
dans le cas où vous connaissez les deux fichiers et définissez vous-même lequel est le "fichier d'origine". Vous pouvez facilement créer un script simple convert-known-hardlink-to-symlink
cela donnerait quelque chose comme :
convert-known-hardlink-to-symlink link original
$ ls -li
3802465 lrwxrwxrwx 1 14 Dec 6 09:52 link -> original
3802269 -rw-rw-r-- 1 0 Dec 6 09:52 original
Mais ce serait vraiment utile si vous aviez un script où vous pourriez définir un répertoire de travail (par défaut ./
) et un répertoire de recherche où chercher (par défaut /
) pour les fichiers avec le même inode, puis convertissez tous ces liens physiques en liens symboliques.
Le résultat serait que dans le répertoire de travail défini, tous les fichiers qui sont des liens physiques sont remplacés par des liens symboliques vers le premier fichier trouvé avec le même inode à la place.
Un début serait find . -type f -links +1 -printf "%i: %p (%n)n"
Réponse acceptée :
J'ai créé un script qui fera cela. Le script convertit tous les liens physiques qu'il trouve dans un répertoire source (premier argument) qui sont les mêmes que dans le répertoire de travail (deuxième argument facultatif) en liens symboliques :
https://gist.github.com/rubo77/7a9a83695a28412abbcd
Il a une option -n pour un essai à vide, qui ne fait rien mais montre ce qui serait fait.
Partie principale :
$WORKING_DIR=./
#relative source directory from working directory:
$SOURCE_DIR=../otherdir/with/hard-links/with-the-same-inodes
# find all files in WORKING_DIR
cd "$WORKING_DIR"
find "." -type f -links +1 -printf "%i %pn" |
while read working_inode working_on
do
find "$SOURCE_DIR" -type f -links +1 -printf "%i %pn" | sort -nk1 |
while read inode file
do
if [[ $inode == $working_inode ]]; then
ln -vsf "$file" "$working_on"
fi
done
done
Le -links +1 –> trouvera tous les fichiers qui ont PLUS d'un lien. Les fichiers liés en dur ont un nombre de liens d'au moins deux.