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?

Chris
fonte
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.

lynxlynxlynx
fonte
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.

Gilles 'SO- parar de ser mau'
fonte
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
Vladimir Botka
fonte