Use `ln` para crear un directorio faltante

10

Así que estoy escribiendo un pequeño administrador de paquetes, y un problema con el que me he encontrado es hacer enlaces simbólicos a los archivos.

Instala el paquete /usr/pkg/name-versiony luego lee un archivo para determinar qué enlaces simbólicos crear. Estoy usando lnpara hacer los enlaces, y me he encontrado con un problema al intentar instalar los encabezados de la API de Linux. Necesito vincular los archivos de encabezado ellos mismos, no las carpetas que los contienen (por lo tanto, si 2 paquetes necesitan colocar archivos en el mismo subdirectorio de inclusión, pueden hacerlo sin arruinar un paquete).

Resolví ese problema, pero lnsimplemente errores si la ruta está incompleta, lo cual es molesto porque esos directorios no deberían existir hasta que se instale el paquete.

¿Hay una bandera para lneso que creará los directorios que faltan, o voy a tener que usar un script bash complicado?

Chris
fuente
1
Puede que me falte algo obvio, pero ¿por qué no estás usando mkdirpara ... hacer directorios?
jw013
Es posible que también desee consultar lndir.
enms.

Respuestas:

3

No necesitará una secuencia de comandos bash enrevesada, sino una simple línea. mkdir --parentsse encargará de todo, incluso no imprimirá un error si la estructura del directorio ya existe.

Solo tenga cuidado con la forma en que trata estos directorios al eliminarlos, para no romper otros paquetes.

Además, como lo está escribiendo bash, puede echar un vistazo a la hechicería (complemento descarado). Tal vez sería más simple simplemente modificar eso, ya que es maduro y flexible.

lynxlynxlynx
fuente
Woops, olvidé mencionar que lo estoy escribiendo en c ++, e interactúo bash con las llamadas system () porque es más fácil. Sin embargo, esto es lo que terminé haciendo, gracias.
Chris
@ Chris: system()no es más fácil, es muy difícil escapar de los argumentos de la línea de comandos correctamente system(). Como mínimo, debe usar posix_spawn()o fork()+exec*(), que acepta argumentos de línea de comandos como matrices.
Lie Ryan
4

No hay bandera para hacer esto ln. Crear directorios no es su trabajo.

mkdir -p foo/bar/quxcreará foo, foo/bary foo/bar/quxsegún sea necesario. Por lo tanto, llame mkdir -pprimero a todos menos al último componente de ruta.

Parece que está reinventando la rueda Stow , un administrador de paquetes simple que combina las jerarquías de directorios creando directorios a la profundidad requerida con enlaces simbólicos a componentes de diferentes paquetes en su interior. O tal vez XStow , que es como Stow pero con más posibilidades de personalización.

Gilles 'SO- deja de ser malvado'
fuente
0

Tal vez tarpodría ayudar a preparar el archivo con los enlaces:

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

Y luego para crear los enlaces donde sea necesario:

tar xvf links.tar
Vladimir Botka
fuente