当我使用
ls -la symlinkName
或 stat symlinkName
时,并非所有路径都会显示
(例如../../../one/two/file.txt
)
显示完整路径的linux命令是什么?
realpath
并非在所有 Linux 版本上都可用,但 readlink
应该可用。
readlink -f symlinkName
以上应该可以解决问题。
或者,如果您没有安装上述任何一个,如果您安装了 python 2.6(或更高版本),则可以执行以下操作
python -c 'import os.path; print(os.path.realpath("symlinkName"))'
realpath <path to the symlink file>
应该可以解决问题。
unix 口味 ->
ll symLinkName
OSX ->
readlink symLinkName
区别在于第一种方式会以闪烁的方式显示符号链接路径,而第二种方式只会在控制台上回显它。
我将在这里进行简短的回顾和分析,但对于那些 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) 是用于规范化功能的首选命令。
您可以将
awk
与 system
调用 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
查看信息的另一种方法是
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: -
希望这可以帮助别人。
在 macOS Catalina 中尝试 -
readlink -n `which <command>`
输入示例 -
readlink -n `which adb`
输出示例 -
/usr/local/Caskroom/android-platform-tools/31.0.1,d027ce0f9f214a4bd575a73786b44d8ccf7e7516/platform-tools/adb
在我的 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
find -maxdepth 1 -type l -printf "%l ”
要在
Mac > Terminal
中获取实际的符号链接指向路径:
ls -lrt <Symlink path/symlink>
当涉及到符号链接时,存在很多混乱。让我们通过例子来回顾一下。另请参阅
realpath
与 readlink
的区别,如果您使用现代发行版,请三思。
所以假设我们有真正的脚本或文件以及指向它的符号链接:
$ ls -la
-rwxr-xr-x 1 root root 0 Sep 20 07:05 realscript.sh
lrwxrwxrwx 1 root root 10 Sep 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
请尝试自己写出修改后的输出:)
realpath
vs readlink
:
readlink - 打印解析的符号链接或规范文件名
描述 注意 realpath(1) 是用于规范化功能的首选命令。
这是听取开发人员自己意见的一个很好的理由。