AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 445812
Accepted
Tim
Tim
Asked: 2018-05-25 08:56:09 +0800 CST2018-05-25 08:56:09 +0800 CST 2018-05-25 08:56:09 +0800 CST

如何在符号链接递归中找到中间体?

  • 772

是否有输出绝对符号链接目标的非递归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
}

我在一个脚本中使用这个函数,该脚本从文件系统周围收集二进制文件和库文件。但我预见到这段代码有一个问题:

  1. 我第一次尝试使用readlink,但这返回了相对于 的符号链接解析路径$file,因此在这些路径上执行的任何操作都会失败。(现在已注释掉,但仍在代码中)(请参阅下面的小编辑)
  2. 之后,我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. 仅复制符号链接并且缺少目标。

bash shell-script
  • 1 1 个回答
  • 973 Views

1 个回答

  • Voted
  1. Best Answer
    muru
    2018-05-25T23:20:46+08:002018-05-25T23:20:46+08:00

    如果我理解正确,对于给出的示例,您需要link1文件link-to-link1. 您可以使用GNUfind和:-printf%l

    $ find . -type l -printf '%p -> %l\n'
    ./link0.1 -> file0
    ./link1 -> file1
    ./link0 -> file0
    ./link-to-link1 -> link1
    

    由于link1需要 的绝对路径作为 的输出/path/to/link-to-link1,可能cd到包含并连续link-to-link1运行readlink/的目录:realpath

    (
    cd "$(dirname "$file")"
    realpath -s "$(readlink "$file")"
    )
    

    realpath -s不解析符号链接,但会打印绝对路径。

    例如:

    ~ file=/tmp/foo/link-to-link1
    ~ (cd "$(dirname "$file")"; realpath -s "$(readlink "$file")")
    /tmp/foo/link1
    

    这也适用于绝对路径的链接:

    ~ file=/tmp/foo/link2
    ~ ln -sfv /tmp/foo/link1 "$file"
    '/tmp/foo/link2' -> '/tmp/foo/link1'
    ~ (cd "$(dirname "$file")"; realpath -s "$(readlink "$file")")
    /tmp/foo/link1
    
    • 2

相关问题

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • MySQL Select with function IN () with bash array

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve