Usa `ln` per creare una directory mancante


10

Quindi sto scrivendo un piccolo gestore di pacchetti e un problema che ho riscontrato è creare collegamenti simbolici ai file.

Installa il pacchetto /usr/pkg/name-versione quindi legge un file per determinare quali collegamenti simbolici creare. Sto usando lnper creare i collegamenti e ho riscontrato un problema durante il tentativo di installare le intestazioni API Linux. Ho bisogno di collegare i file di intestazione stessi, non le cartelle che li contengono (quindi se 2 pacchetti devono mettere i file nella stessa sottodirectory di include possono rovinare un pacchetto).

Ho risolto il problema, ma ho lnsemplicemente eliminato gli errori se il percorso è incompleto, il che è fastidioso perché quelle directory non dovrebbero esistere fino a quando il pacchetto non viene installato.

C'è un flag per lnquesto creerà eventuali directory mancanti o dovrò andare con qualche script bash contorto?


1
Forse mi manca qualcosa di ovvio, ma perché non stai usando mkdirper ... creare directory?
jw013,

Potresti anche voler dare un'occhiata lndir.
am

Risposte:


3

Non avrai bisogno di uno script bash contorto, ma di una semplice riga. mkdir --parentssi occuperà di tutto, senza nemmeno stampare un errore se la struttura della directory esiste già.

Fai solo attenzione a come tratti queste directory durante la rimozione, in modo da non rompere altri pacchetti.

Inoltre, dato che lo stai scrivendo bash, puoi dare un'occhiata alla stregoneria (spina spudorata). Forse sarebbe più semplice modificarlo, poiché è maturo e flessibile.


Accidenti, ho dimenticato di menzionare che lo sto scrivendo in c ++ e l'interfacciamento di bash con le chiamate di sistema () perché è più facile. Questo è quello che ho finito per fare, grazie.
Chris,

@Chris: system()non è più facile, è molto difficile sfuggire correttamente agli argomenti della riga di comando system(). Per lo meno dovresti usare posix_spawn()o fork()+exec*(), che accetta gli argomenti della riga di comando come array.
Lie Ryan,

4

Non c'è bandiera con cui farlo ln. La creazione di directory non è il suo lavoro.

mkdir -p foo/bar/quxcreerà e foo, se necessario. Quindi chiama prima tutti i componenti tranne l'ultimo percorso.foo/barfoo/bar/quxmkdir -p

Sembra che tu stia reinventando la ruota Stow , un semplice gestore di pacchetti che unisce le gerarchie di directory creando directory alla profondità richiesta con collegamenti simbolici a componenti di diversi pacchetti all'interno. O forse XStow , che è come Stow ma con più possibilità di personalizzazione.


0

Forse tarpotrebbe aiutare a preparare il file con i collegamenti:

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

E quindi per creare i collegamenti dove necessario:

tar xvf links.tar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.