Use `ln` para criar um diretório ausente


10

Então, estou escrevendo um pequeno gerenciador de pacotes, e um problema que encontrei é criar os links simbólicos para os arquivos.

Ele instala o pacote /usr/pkg/name-versione lê um arquivo para determinar quais links simbólicos criar. Estou usando lnpara criar os links e tive um problema ao tentar instalar os cabeçalhos da API do Linux. Eu preciso vincular os arquivos de cabeçalho, não as pastas que os contêm (por isso, se 2 pacotes precisarem colocar arquivos no mesmo subdiretório de include, eles podem, sem estragar um pacote).

Resolvi esse problema, mas lnsimplesmente erro se o caminho estiver incompleto, o que é irritante porque esses diretórios não deveriam existir até que o pacote seja instalado.

Existe um sinalizador para lnisso, que criará os diretórios que estão faltando, ou eu precisarei usar algum script complicado do bash?


11
Talvez esteja faltando algo óbvio, mas por que você não está usando mkdirpara ... criar diretórios?
Jw013

Você também pode querer conferir lndir.
01/07/2012

Respostas:


3

Você não precisará de um script bash complicado, mas de uma linha simples. mkdir --parentscuidará de tudo, nem mesmo imprimir um erro se a estrutura de diretórios já existir.

Apenas tenha cuidado com o tratamento desses diretórios na remoção, para não quebrar outros pacotes.

Além disso, como você está escrevendo bash, pode dar uma olhada na feitiçaria (plugue descarado). Talvez seja mais simples apenas modificar isso, pois é maduro e flexível.


Woops, esqueci de mencionar que estou escrevendo em c ++ e fazendo interface com o bash com chamadas system () porque é mais fácil. Foi isso que acabei fazendo, obrigado.
Chris

@ Chris: system()não é mais fácil, é muito difícil escapar dos argumentos da linha de comando corretamente system(). No mínimo, você deve usar posix_spawn()or fork()+exec*(), que aceita argumentos de linha de comando como matrizes.
Lie Ryan

4

Não há sinalizador para fazer isso ln. Criar diretórios não é seu trabalho.

mkdir -p foo/bar/quxcriará e foo, conforme necessário. Portanto, chame primeiro todos, exceto o último componente do caminho.foo/barfoo/bar/quxmkdir -p

Parece que você está reinventando o wheel Stow , um gerenciador de pacotes simples que mescla hierarquias de diretórios, criando diretórios com a profundidade necessária, com links simbólicos para componentes de diferentes pacotes internos. Ou talvez o XStow , que é como o Stow, mas com mais possibilidades de personalização.


0

Talvez tarpossa ajudar a preparar o arquivo com os links:

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

E então, para criar os links onde necessário:

tar xvf links.tar
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.