GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Einen Hardlink in einen symbolischen Link umwandeln?

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.


Linux
  1. Umgebungsvariablen in symbolischen Links

  2. Symbolischen Link erstellen:Protokollfehler

  3. Überleben symbolische Linkdateien SVN?

  4. Warum funktioniert mein symbolischer Link nicht?

  5. Wie listet man symbolische Linkketten auf?

Konvertieren Sie Ihre Windows-Installation in eine VM unter Linux

Ln-Befehl:So erstellen Sie symbolische Links in Linux

Ln-Befehl unter Linux (Symbolische Links erstellen)

So erstellen Sie einen symbolischen Link in Linux mit dem Ln-Befehl

Anleitung zum Hinzufügen symbolischer Linux-Links

So konvertieren Sie Bilder in das ASCII-Format unter Linux