如何解析目录中的所有符号链接?

如何解析目录中的所有符号链接?

我正在尝试从上游源代码(不是我的)制作一个 debian 包。configure作者提供的脚本在源目录中创建了很多符号链接。它们是src指向子目录中所有标题的符号链接include(这样 makefile 就可以include在安装开发包的情况下轻松复制目录)。我正在使用debhelper脚本来制作包。

我正在使用debhelper脚本制作软件包。问题是使用新的 Debian 软件包格式 ( quilt 3.0 native),debuild拒绝将包含符号链接的源目录更改添加到最终diff文件。我收到如下错误:

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

我知道一个好的解决方案:更改配置脚本,使其根本不对任何标头进行符号链接。它应该添加一个目标来makefile安装devel包。虽然配置脚本存在版权问题。我不能接触上游源代码。

我正在寻找一个 bash 脚本,用于将目录中的所有符号链接替换为它们指向的实际文件。例如,如果目录中d有三个文件abc,它们将符号链接指向../../foo/bar/x,,../../foo/bar/z ../../foo/bar/y运行所需的脚本(例如magic.sh),给出./d作为第一个参数,应该

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

我找不到方法来知道符号链接指向哪个文件。

答案1

使用readlink

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

并将其包装在一个 shell 脚本中,遍历目录中的符号链接。

您可以使用以下方法查找符号链接find

$ find . -type l

更完整的例子:

#!/bin/bash

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

输出

link: ./.remmina resolved: sparkleshare-homedir/remmina
link: ./project resolved: Documents/2011-2 Project/
link: ./.ssh resolved: sparkleshare-homedir/ssh

相关内容