Verwenden Sie `ln`, um ein fehlendes Verzeichnis zu erstellen


10

Ich schreibe also einen kleinen Paketmanager, und ein Problem, auf das ich gestoßen bin, besteht darin, symbolische Links zu Dateien zu erstellen.

Es installiert das Paket in /usr/pkg/name-versionund liest dann eine Datei, um zu bestimmen, welche symbolischen Links hergestellt werden sollen. Ich verwende ln, um die Links zu erstellen, und beim Versuch, die Linux-API-Header zu installieren, ist ein Problem aufgetreten. 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 dies, ohne ein Paket zu vermasseln).

Dieses Problem habe ich gelöst, aber lneinfach Fehler gemacht, wenn der Pfad unvollständig ist, was ärgerlich ist, da diese Verzeichnisse erst existieren sollten, wenn das Paket installiert ist.

Gibt es ein Flag dafür ln, das fehlende Verzeichnisse erstellt, oder muss ich ein verschlungenes Bash-Skript verwenden?


1
Ich vermisse vielleicht etwas Offensichtliches, aber warum benutzt du nicht mkdir... um Verzeichnisse zu erstellen ?
jw013

Vielleicht möchten Sie auch auschecken lndir.
Ams

Antworten:


3

Sie benötigen kein kompliziertes Bash-Skript, sondern einen einfachen Einzeiler. mkdir --parentskümmert sich um alles, schön nicht einmal einen Fehler zu drucken, wenn die Verzeichnisstruktur bereits existiert.

Seien Sie nur vorsichtig, wie Sie diese Verzeichnisse beim Entfernen behandeln, damit Sie andere Pakete nicht beschädigen.

Da Sie es einschreiben bash, können Sie sich auch die Zauberei (schamloser Stecker) ansehen . Vielleicht wäre es einfacher, das zu ändern, da es ausgereift und flexibel ist.


Woops, ich habe vergessen zu erwähnen, dass ich es in c ++ schreibe und bash mit system () -Aufrufen verbinde, weil es einfacher ist. Das habe ich aber letztendlich gemacht, danke.
Chris

@ Chris: system()ist nicht einfacher, es ist sehr schwer, Befehlszeilenargumente richtig zu umgehen system(). Zumindest sollten Sie posix_spawn()oder verwenden fork()+exec*(), das Befehlszeilenargumente als Arrays akzeptiert.
Lie Ryan

4

Es gibt keine Flagge, mit der man das machen könnte ln. Das Erstellen von Verzeichnissen ist nicht seine Aufgabe.

mkdir -p foo/bar/quxwird erstellen foo, foo/barund foo/bar/quxnach Bedarf. Rufen Sie also zuerst mkdir -palle bis auf die letzte Pfadkomponente auf.

Es hört sich so an, als würden Sie das Rad Stow neu erfinden , einen einfachen Paketmanager, der Verzeichnishierarchien zusammenführt, indem er Verzeichnisse in der erforderlichen Tiefe mit symbolischen Links zu Komponenten verschiedener Pakete erstellt. Oder vielleicht XStow , das wie Stow ist, aber mehr Anpassungsmöglichkeiten bietet .


0

Vielleicht tarkönnte helfen, die Datei mit den Links vorzubereiten:

find . -type l > links.txt
tar cpf links.tar --files-from links.txt

Und dann, um die Links zu erstellen, wo es nötig ist:

tar xvf links.tar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.