是否有输出绝对符号链接目标的非递归readlink -f
/替代方法?realpath
也欢迎更兼容 POSIX 的解决方案。
我的 shell 脚本中有一个功能块,如下所示:
set FILES
# addFile adds a file to the FILES list. If file is a symlink,
# it will also find and add the destination.
addFile() {
file="$1"
# Check if file is already included in list
echo "$FILES" | grep -q "$file" && return
FILES="$FILES $file"
if [ -L $file ]; then
addFile $(realpath $file)
#addFile $(readlink $file)
fi
}
我在一个脚本中使用这个函数,该脚本从文件系统周围收集二进制文件和库文件。但我预见到这段代码有一个问题:
- 我第一次尝试使用
readlink
,但这返回了相对于 的符号链接解析路径$file
,因此在这些路径上执行的任何操作都会失败。(现在已注释掉,但仍在代码中)(请参阅下面的小编辑) - 之后,我
realpath
改用man readlink
. 它几乎可以工作。
现在,我想要执行的操作可以工作了。但是,在最终结果中,我复制了 initramfs 中的所有二进制文件、库和符号链接。如果有任何递归符号链接,则仅包括顶层和目标,而不包括中间符号链接。因此,打破了符号链接。
我创建了一个小提琴来演示这个问题。link-to-link1
指向link1
,指向file1
。最终结果link1
丢失并被link-to-link1
破坏。
编辑; 澄清问题
在以下一组符号链接上运行上述函数时:
# Contents of ~/test/src
file0
file1
link0 -> file0
link0.1 -> file0
link1 -> file1
link-to-link1 -> link1
和:
copy="link-to-link1 link0 link0.1"
for sf in $copy; do
addFile ~/test/src/$sf
done;
cp -av $FILES ~/test/dst
您会发现只$copy
复制了 3 个链接和 2 个文件。但是,中间链接link1
丢失并且link-to-link1
被破坏。
我希望脚本也能找到link1
。请记住,在运行此脚本的环境中,文件和符号链接的位置必须是绝对的。
次要编辑
添加另一个小提琴来演示相对路径的失败,使用readlink
. 仅复制符号链接并且缺少目标。
如果我理解正确,对于给出的示例,您需要
link1
文件link-to-link1
. 您可以使用GNUfind
和:-printf
%l
由于
link1
需要 的绝对路径作为 的输出/path/to/link-to-link1
,可能cd
到包含并连续link-to-link1
运行readlink
/的目录:realpath
realpath -s
不解析符号链接,但会打印绝对路径。例如:
这也适用于绝对路径的链接: