Use `ln` para criar um diretório ausente

Use `ln` para criar um diretório ausente

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

Ele instala o pacote em /usr/pkg/name-versione depois lê um arquivo para determinar quais links simbólicos criar. Estou usando lnpara fazer os links, e me deparei com um problema ao tentar instalar os headers da API do Linux. Preciso vincular os próprios arquivos de cabeçalho, não as pastas que os contêm (portanto, se 2 pacotes precisarem colocar arquivos no mesmo subdiretório de inclusão, eles poderão fazê-lo sem estragar um pacote).

Esse problema eu resolvi, mas lnsimplesmente ocorre um erro se o caminho estiver incompleto, o que é irritante porque esses diretórios não deveriam existir até que o pacote fosse instalado.

Existe um sinalizador para lncriar algum diretório que esteja faltando ou terei que usar algum script bash complicado?

Responder1

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

mkdir -p foo/bar/quxcriará fooe foo/barconforme foo/bar/quxnecessário. Portanto, chame mkdir -pprimeiro todos, exceto o último componente do caminho.

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

Responder2

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

Apenas tome cuidado com a forma como você trata esses diretórios na remoção, para não quebrar outros pacotes.

Além disso, como você está escrevendo em bash, você pode dar uma olhada emfeitiçaria(plugue sem vergonha). Talvez fosse mais simples apenas modificar isso, pois é maduro e flexível.

Responder3

Talvez tarpudesse 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 quando necessário:

tar xvf links.tar

informação relacionada