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


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

estou a usar debhelper scripts para fazer o pacote. O problema é usar o novo formato de pacote debian (quilt 3.0 native) debuild recusa adicionar alterações do diretório de origem que consistem em links simbólicos para o final diff Arquivo. 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 ligar symlink a qualquer cabeçalho. Deve adicionar um alvo para makefile para instalar devel pacote. 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 existem três arquivos a e b e c, que eles comeram links simbólicos 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.


4
2017-09-18 17:52


origem




Respostas:


Usar readlink.

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

e embrulhe-o em um shell script percorrendo 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

4
2017-09-18 17:57



pastebin.com/FNWQAsbm Espero que este trabalho para mim ... - sorush-r
Funciona bem ... obrigado :) - sorush-r
Certifique-se de fazer o escape adequado ao fazer as operações. Um link simbólico para resolver bla / bla pode se expandir para isso: rm -rf bla / bla. Não tenho certeza se o seu exemplo impede isso, o meu não. - gertvdijk