Utilisez `ln` pour créer un répertoire manquant

10

J'écris donc un petit gestionnaire de paquets, et un problème que j'ai rencontré est de créer des liens symboliques vers des fichiers.

Il installe le package dans /usr/pkg/name-version, puis lit un fichier pour déterminer les liens symboliques à créer. J'utilise lnpour créer les liens et j'ai rencontré un problème lors de la tentative d'installation des en-têtes d'API Linux. J'ai besoin de lier les fichiers d'en-tête eux-mêmes, pas les dossiers qui les contiennent (donc si 2 paquets doivent mettre des fichiers dans le même sous-répertoire d'inclure, ils peuvent le faire sans visser un paquet).

Ce problème, j'ai résolu, mais lnsimplement des erreurs si le chemin est incomplet, ce qui est ennuyeux car ces répertoires ne devraient pas exister jusqu'à ce que le package soit installé.

Y a-t-il un indicateur pour lncréer des répertoires manquants, ou vais-je devoir utiliser un script bash alambiqué?

Chris
la source
1
Il me manque peut-être quelque chose d'évident, mais pourquoi n'utilisez-vous pas mkdirpour ... créer des répertoires?
jw013
Vous pourriez également vouloir vérifier lndir.
ams

Réponses:

3

Vous n'aurez pas besoin d'un script bash alambiqué, mais d'un simple liner. mkdir --parentsva s'occuper de tout, et même pas imprimer une erreur si la structure du répertoire existe déjà.

Faites juste attention à la façon dont vous traitez ces répertoires lors de leur suppression, afin de ne pas casser les autres packages.

De plus, puisque vous l'écrivez bash, vous pouvez jeter un œil à la sorcellerie (plug sans vergogne). Il serait peut-être plus simple de simplement modifier cela, car il est mature et flexible.

lynxlynxlynx
la source
Woops, j'ai oublié de mentionner que je l'écris en c ++ et que j'interface bash avec les appels system () parce que c'est plus facile. C'est pourtant ce que j'ai fini par faire, merci.
Chris
@Chris: system()n'est pas plus facile, il est très difficile d'échapper correctement aux arguments de la ligne de commande system(). À tout le moins, vous devez utiliser posix_spawn()ou fork()+exec*(), qui accepte les arguments de ligne de commande en tant que tableaux.
Lie Ryan
4

Il n'y a pas de drapeau pour faire ça ln. La création de répertoires n'est pas son métier.

mkdir -p foo/bar/quxva créer foo, foo/baret foo/bar/quxau besoin. Appelez donc mkdir -ptous les composants sauf le dernier chemin.

Il semble que vous réinventiez la roue Stow , un simple gestionnaire de packages qui fusionne les hiérarchies de répertoires en créant des répertoires à la profondeur requise avec des liens symboliques vers les composants de différents packages à l'intérieur. Ou peut-être XStow , qui est comme Stow mais avec plus de possibilités de personnalisation.

Gilles 'SO- arrête d'être méchant'
la source
0

Peut tar- être pourrait aider à préparer le fichier avec les liens:

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

Et puis pour créer les liens là où c'est nécessaire:

tar xvf links.tar
Vladimir Botka
la source