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.