Ich schreibe gerade einen kleinen Paketmanager und bin auf ein Problem gestoßen, das die Erstellung der symbolischen Links zu Dateien betrifft.
Es installiert das Paket in /usr/pkg/name-version
und liest dann eine Datei, um zu bestimmen, welche symbolischen Links erstellt werden sollen. Ich verwende ln
zum Erstellen der Links und bin beim Versuch, die Linux-API-Header zu installieren, auf ein Problem gestoßen. Ich muss die Header-Dateien selbst verknüpfen, nicht die Ordner, die sie enthalten (wenn also 2 Pakete Dateien im selben Unterverzeichnis von include ablegen müssen, können sie das, ohne ein Paket zu vermasseln).
Dieses Problem habe ich gelöst, aber ln
es tritt einfach ein Fehler auf, wenn der Pfad unvollständig ist, was ärgerlich ist, da diese Verzeichnisse nicht existieren sollten, bis das Paket installiert ist.
Gibt es ein Flag, ln
das alle fehlenden Verzeichnisse erstellt, oder muss ich mit einem komplizierten Bash-Skript vorgehen?
Antwort1
Dafür gibt es kein Flag ln
. Das Erstellen von Verzeichnissen ist nicht seine Aufgabe.
mkdir -p foo/bar/qux
wird erstellt foo
, foo/bar
und foo/bar/qux
zwar nach Bedarf. Rufen Sie also mkdir -p
zuerst alle Pfadkomponenten außer der letzten auf.
Es klingt, als würden Sie das Rad neu erfinden Verstauen, ein einfacher Paketmanager, der Verzeichnishierarchien zusammenführt, indem er Verzeichnisse in der erforderlichen Tiefe mit symbolischen Links zu Komponenten verschiedener Pakete darin erstellt. Oder vielleichtXStow, das wie Stow ist, aber mehr Anpassungsmöglichkeiten bietet.
Antwort2
Sie benötigen kein kompliziertes Bash-Skript, sondern einen einfachen Einzeiler. Dieser mkdir --parents
kümmert sich um alles und gibt netterweise nicht einmal einen Fehler aus, wenn die Verzeichnisstruktur bereits vorhanden ist.
Gehen Sie beim Entfernen dieser Verzeichnisse vorsichtig vor, damit andere Pakete nicht beschädigt werden.
Und da Sie es in schreiben bash
, können Sie einen Blick aufZauberei(unverhohlene Werbung). Vielleicht wäre es einfacher, das einfach zu ändern, da es ausgereift und flexibel ist.
Antwort3
Vielleicht tar
könnte es helfen, die Datei mit den Links vorzubereiten:
find . -type l > links.txt
tar cpf links.tar --files-from links.txt
Und erstellen Sie dann bei Bedarf die Links:
tar xvf links.tar