GNU/Linux >> Tutoriales Linux >  >> Linux

¿Convertir un enlace duro en un enlace simbólico?

Es fácil convertir un enlace simbólico en un enlace fijo con ln -f (ejemplo)

También sería fácil convertir un enlace fijo (nombres de archivo link y original ) de vuelta a un enlace simbólico a link->original en el caso de que conozcas ambos archivos y definas cuál es el “archivo original”. Puede crear fácilmente un script simple convert-known-hardlink-to-symlink eso daría como resultado algo como:

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

Pero sería realmente útil si tuviera un script donde pudiera definir un directorio de trabajo (predeterminado ./ ) y un directorio de búsqueda donde buscar (predeterminado / ) para archivos con el mismo inodo y luego convertir todos esos enlaces duros en enlaces simbólicos.

El resultado sería que en el directorio de trabajo definido todos los archivos que son enlaces duros se reemplazan con enlaces simbólicos al primer archivo encontrado con el mismo inodo.

Un comienzo sería find . -type f -links +1 -printf "%i: %p (%n)n"

Respuesta aceptada:

Creé un script que hará esto. El script convierte todos los enlaces físicos que encuentra en un directorio de origen (primer argumento) que son los mismos que en el directorio de trabajo (segundo argumento opcional) en enlaces simbólicos:

https://gist.github.com/rubo77/7a9a83695a28412abbcd

Tiene una opción -n para un ensayo, que no hace nada más que mostrar lo que se haría.

Parte principal:

$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

Los -enlaces +1 –> Encontrarán todos los archivos que tengan MÁS de 1 enlace. Los archivos con enlaces fijos tienen un recuento de enlaces de al menos dos.


Linux
  1. ¿Cómo comprimir un enlace simbólico?

  2. ¿Cómo muevo un enlace simbólico relativo?

  3. Error de ldconfig:no es un enlace simbólico

  4. ¿Los archivos de enlaces simbólicos sobreviven a SVN?

  5. ¿Cómo listar cadenas de eslabones simbólicos?

Convierta su instalación de Windows en una VM en Linux

Comando Ln:Cómo crear enlaces simbólicos en Linux

Comando Ln en Linux (Crear enlaces simbólicos)

Cómo crear un enlace simbólico en Linux usando el comando Ln

Guía para agregar enlaces simbólicos de Linux

Cómo convertir imágenes a formato ASCII en Linux