GNU/Linux >> Tutoriels Linux >  >> Linux

Convertir un lien physique en lien symbolique ?

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.


Linux
  1. Convertir la clé privée Openssh en clé privée Ssh2 ?

  2. Variables d'environnement dans les liens symboliques

  3. Comment déplacer un lien symbolique relatif ?

  4. erreur ldconfig :n'est pas un lien symbolique

  5. Convertir la sortie ls en csv

Convertissez votre installation Windows en VM sous Linux

Commande Ln :comment créer des liens symboliques sous Linux

Commande Ln sous Linux (Créer des liens symboliques)

Comment créer un lien symbolique sous Linux à l'aide de la commande Ln

Guide pour ajouter des liens symboliques Linux

Comment convertir des images au format ASCII sous Linux