como resolver todos os links simbólicos em um diretório?

4

Estou tentando fazer um pacote debian a partir do código-fonte do upstream que não é meu. O script configure fornecido pelo autor faz muitos links simbólicos no diretório de origem. Eles são links simbólicos para todos os cabeçalhos em src subdiretório para include subdir (para que o makefile possa facilmente copiar o diretório include no caso de instalar o pacote de desenvolvimento). Estou usando debhelper scripts para fazer o pacote.

Estou usando scripts debhelper para criar um pacote. O problema é usar o novo formato de pacote debian ( quilt 3.0 native ), debuild recusa adicionar alterações do diretório fonte contendo links simbólicos para o arquivo diff final. Estou recebendo erros assim:

dpkg-source: error: cannot represent change to foo.h:
dpkg-source: error:   new version is symlink to /ba/foo/foo.h
dpkg-source: error:   old version is nonexistent

Estou ciente da boa solução: altere o script de configuração para não vincular qualquer cabeçalho de forma alguma. Ele deve adicionar um destino a makefile para instalar devel package. Embora o script de configuração tenha problemas de direitos autorais. Eu não posso tocar na fonte do upstream.

Eu estou procurando um script bash para substituir todos os links simbólicos em um diretório com arquivos reais para os quais eles apontam. Por exemplo, se no diretório d houver três arquivos a e b e c , comiam symlinks para ../../foo/bar/x , ../../foo/bar/z ../../foo/bar/y , executando o script desejado (digamos magic.sh ) dando o ./d como primeiro argumento, deve

cp ../../foo/bar/x ./d/a
cp ../../foo/bar/y ./d/b
cp ../../foo/bar/z ./d/c

Não consigo encontrar uma maneira de saber para qual arquivo um link simbólico está apontando.

    
por sorush-r 18.09.2012 / 19:52

1 resposta

4

Use readlink .

$ readlink /etc/alternatives/editor
/usr/bin/vim.basic

e envolvê-lo em um shell script andando sobre os links simbólicos no diretório.

Você pode encontrar links simbólicos usando find :

$ find . -type l

Um exemplo mais completo:

#!/bin/bash

find . -maxdepth 1 -type l | while read LINE; do 
echo link: $LINE resolved: 'readlink $LINE'
done

saídas

link: ./.remmina resolved: sparkleshare-homedir/remmina
link: ./project resolved: Documents/2011-2 Project/
link: ./.ssh resolved: sparkleshare-homedir/ssh
    
por gertvdijk 18.09.2012 / 19:57