Es ist einfach, einen Symlink mit ln -f
in einen Hardlink umzuwandeln (Beispiel)
Es wäre auch einfach, einen Hardlink (Dateinamen link
und original
) zurück zu einem symbolischen Link zu link->original
für den Fall, dass Sie beide Dateien kennen und selbst bestimmen, welche die „Originaldatei“ ist. Sie könnten ganz einfach ein einfaches Skript convert-known-hardlink-to-symlink
erstellen das würde zu etwas führen wie:
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
Aber es wäre wirklich nützlich, wenn Sie ein Skript hätten, in dem Sie ein Arbeitsverzeichnis definieren könnten (standardmäßig ./
) und ein Suchverzeichnis, in dem gesucht werden soll (standardmäßig /
) für Dateien mit demselben Inode und wandelt dann alle diese festen Links in symbolische Links um.
Das Ergebnis wäre, dass im definierten Arbeitsverzeichnis alle Dateien, die Hardlinks sind, stattdessen durch symbolische Links auf die erste gefundene Datei mit demselben Inode ersetzt werden.
Ein Anfang wäre find . -type f -links +1 -printf "%i: %p (%n)n"
Akzeptierte Antwort:
Ich habe ein Skript erstellt, das dies tun wird. Das Skript wandelt alle Hard-Links, die es in einem Quellverzeichnis (erstes Argument) findet, die dieselben sind wie im Arbeitsverzeichnis (optionales zweites Argument), in symbolische Links um:
https://gist.github.com/rubo77/7a9a83695a28412abbcd
Es hat eine Option -n für einen Trockenlauf, der nichts tut, sondern zeigt, was getan werden würde.
Hauptteil:
$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
Die -links +1 –> Findet alle Dateien, die MEHR als 1 Link haben. Fest verlinkte Dateien haben eine Linkanzahl von mindestens zwei.