【问题标题】:How to see full absolute path of a symlink如何查看符号链接的完整绝对路径
【发布时间】:2013-04-15 14:15:50
【问题描述】:

当我使用ls -la symlinkNamestat symlinkName 时,不会显示所有路径 (例如../../../one/two/file.txt

显示完整路径的 linux 命令是什么?

【问题讨论】:

  • 这里要小心:当 ls 或 stat 显示没有绝对路径时——链接没有绝对路径!这是特别的。安装设备时很重要,例如在不同的情况下(例如,如果您在 cd 或 USB 棒上有东西,或者尝试恢复一些损坏的硬盘)。所有提到的解决方案(realpath、readlink、....)仅显示已安装上下文中的绝对路径。

标签: linux symlink


【解决方案1】:

realpath 并非在所有 linux 版本上都可用,但 readlink 应该可用。

readlink -f symlinkName

以上应该可以解决问题。

或者,如果您没有安装上述任何一个,如果您安装了 python 2.6(或更高版本),则可以执行以下操作

python -c 'import os.path; print(os.path.realpath("symlinkName"))'

【讨论】:

  • 如果使用 OSX,请省略 -f 标志,这样就可以了。即readlink symlinkName
  • 在 OSX 上省略 -f 标志只会给出相对路径
  • 这个问题是关于 Linux 的,你们大家。
  • 在 ubuntu 上我不需要 -f 标志
【解决方案2】:

realpath <path to the symlink file> 应该可以解决问题。

【讨论】:

  • man realpath 在底部显示它是“GNU coreutils”的一部分,我很确定它总是出现在 Ubuntu 上,所以即使 @IanStapletonCordasco 说“realpath 不可用在所有 linux 版本上”,我相信它至少应该在所有 Ubuntu 和 Ubuntu 衍生版本上都可用。
【解决方案3】:

unix 风格 -> ll symLinkName

OSX -> readlink symLinkName

不同之处在于第一种方式会以闪烁的方式显示符号链接路径,而第二种方式只会在控制台上回显。

【讨论】:

  • 问题是专门询问完整/绝对路径,而不是相对路径(../../file.txt)。这两个答案都会给出相对路径。
【解决方案4】:

查看信息的另一种方法是stat 命令,它将显示更多信息。命令stat ~/.ssh在我的机器上显示

File: ‘/home/sumon/.ssh’ -> ‘/home/sumon/ssh-keys/.ssh.personal’
  Size: 34          Blocks: 0          IO Block: 4096   symbolic link
Device: 801h/2049d  Inode: 25297409    Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/   sumon)   Gid: ( 1000/   sumon)
Access: 2017-09-26 16:41:18.985423932 +0600
Modify: 2017-09-25 15:48:07.880104043 +0600
Change: 2017-09-25 15:48:07.880104043 +0600
 Birth: -

希望这可以帮助某人。

【讨论】:

    【解决方案5】:

    您可以使用 awksystem 调用 readlink 以获得具有完整符号链接路径的 ls 输出。例如:

    ls | awk '{printf("%s ->", $1); system("readlink -f " $1)}'
    

    将显示例如

    thin_repair ->/home/user/workspace/boot/usr/bin/pdata_tools
    thin_restore ->/home/user/workspace/boot/usr/bin/pdata_tools
    thin_rmap ->/home/user/workspace/boot/usr/bin/pdata_tools
    thin_trim ->/home/user/workspace/boot/usr/bin/pdata_tools
    touch ->/home/user/workspace/boot/usr/bin/busybox
    true ->/home/user/workspace/boot/usr/bin/busybox
    

    【讨论】:

    • ls 可以在没有 readlink 的情况下完成;只需使用ls -l。这也根本不起作用,尝试对目录中的所有内容(非链接)执行此操作,并且如果您的 ls 配置为使用颜色,则 awk 完全中断。只需使用find . -maxdepth 1 -type l -ls | awk '{print $11 "\t" $12 "\t" $13}'
    【解决方案6】:

    在我的 Mac 上,我有以下内容:

    例如创建指向目录的符号链接:ln -s /Users/test/play/game game

    然后,如果我使用符号链接转到目录:cd game 如果我发出 cmd:pwd,你实际所在的目录是:~

    如果我出于某种原因决定实际更改为目录:/Users/test/play/game,我的 .bash_profile 设置中有一个别名:

    alias cdp='cd -P $(basename `pwd`)'
    

    使用上面的cdp别名后,再跟pwd命令当前目录为:/Users/test/play/game

    【讨论】:

      【解决方案7】:

      在 macOS Catalina 中尝试 -

      readlink -n `which <command>`
      

      示例输入 -

      readlink -n `which adb`
      

      示例输出 -

      /usr/local/Caskroom/android-platform-tools/31.0.1,d027ce0f9f214a4bd575a73786b44d8ccf7e7516/platform-tools/adb
      

      【讨论】:

        【解决方案8】:

        我将在这里进行简短的回顾和分析,但对于那些 TL;DR 这里是 bash 的单行,用于锚定工作目录:

        script_home=$( dirname $(realpath "$0") )
        

        或者您可以使用任何其他文件名而不是 $0 来确定它的真实位置。

        不仅存在确定某些文件的真实路径的问题,尤其是某些脚本是通过符号链接从另一个位置调用的,并且需要引用相对于它的真实工作目录的其他资源。

        详情如下。假设我们有真正的脚本或文件以及指向它的符号链接:

        $ ls -la
        -rwxr-xr-x 1 root    root  0 Mar 20 07:05 realscript.sh
        lrwxrwxrwx 1 root    root 10 Mar 20 07:05 symlink -> realscript.sh
        

        而 GNU coreutils 的一部分是一些非常有用的命令:

        $ realpath symlink
        /home/test/realscript.sh
        

        另见原文:

        realpath realscript.sh
        /home/test/realscript.sh
        

        在脚本中也非常好的组合是在脚本上使用dirname

        $ dirname /home/test/realscript.sh
        /home/test
        

        所以总结一下,你可以在脚本中使用

        echo  $( dirname $(realpath "symlink") )
        

        或获取并存储在变量真实脚本主目录中并保存代码以获取真实路径脚本realscript.sh:

        script_home=$( dirname $(realpath "$0") )
        echo Original script home: $script_home
        

        其中“$0”在 shell 脚本中被定义为“self”。

        为了测试所有内容,我们将符号链接放入 /home/test2/,修改一些附加内容并从根目录运行/调用它:

        $ /home/test2/symlink
        /home/test
        Original script home: /home/test
        Original script is: /home/test/realscript.sh
        Called script is: /home/test2/symlink
        

        请尝试自己编写修改后的输出:)

        2021年更新,还有命令:

        readlink - 打印已解析的符号链接或规范文件名

        描述 注意 realpath(1) 是用于规范化功能的首选命令。

        【讨论】:

          猜你喜欢
          • 2015-06-10
          • 1970-01-01
          • 1970-01-01
          • 2011-03-14
          • 2019-07-13
          • 1970-01-01
          • 2013-12-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多