问题

如何用 Linux 命令快速查询一个符号链接最终指向的文件?

回答
好的,咱们不整那些花里胡哨的AI套话,直接说点硬核的。在Linux的世界里,符号链接(symlink)就像是文件的快捷方式,一个链接可以指向另一个文件或者目录。有时候我们拿到一个链接,想知道它到底指向了哪块地,这时候就需要用点小技巧了。

核心工具:`ls l` 与 `readlink`

最常用、最直观的两个工具就是 `ls l` 和 `readlink` 了。

1. `ls l`:一眼看穿,直观明了

`ls l` 命令本身就能告诉你很多信息,包括文件类型、权限、所有者、大小等等。当它遇到符号链接时,它会非常有礼貌地告诉你这个链接指向了哪里。

用法示例:

假设你有一个名为 `mylink` 的符号链接,你想知道它指向了哪个文件。你只需要这样做:

```bash
ls l mylink
```

输出解读:

你会看到类似这样的输出:

```
lrwxrwxrwx 1 user user 15 Mar 15 10:30 mylink > /path/to/original/file
```

开头的 `l`: 这个 `l` 是关键,它表明这是一个符号链接。
`>`: 这个箭头符号直接告诉你,`mylink` 这个链接指向了右边的 `/path/to/original/file`。

优点:

直观: 一眼就能看到链接和它指向的目标。
信息丰富: 除了指向的目标,还能看到链接本身的权限、所有者等信息。
无需额外安装: 这是所有Linux系统都自带的基本命令。

缺点:

多级链接: 如果你的链接是一个链接的链接(比如 `linkA` 指向 `linkB`,而 `linkB` 指向 `real_file`),`ls l` 只会显示 `linkA` 指向 `linkB`,并不会递归地帮你追到 `real_file`。这时候就需要我们手动再对 `linkB` 执行一次 `ls l`。

2. `readlink`:专为链接而生,精准打击

`readlink` 命令专门用于读取符号链接的实际指向。它比 `ls l` 更专注于这个“指向”本身,而且它有更强大的选项来处理多级链接。

用法示例(基本):

```bash
readlink mylink
```

输出解读:

它只会输出链接指向的目标路径,比如:

```
/path/to/original/file
```

更强大的选项:`f` (canonicalize by following every symlink in every component of the given name recursively)

这个选项是 `readlink` 的“杀手锏”。它会沿着链接链一路追到底,直到找到那个最终的、非链接的目标文件。

用法示例(递归追溯):

假设我们有这样的链接结构:
`linkA` > `linkB`
`linkB` > `/path/to/real/file.txt`

如果我们想知道 `linkA` 最终指向什么,直接用 `readlink linkA` 只会得到 `linkB` 的路径。但使用 `f` 就不同了:

```bash
readlink f linkA
```

输出解读:

它会输出最终的真实文件路径:

```
/path/to/real/file.txt
```

优点:

精准: 只输出目标路径,非常干净利落。
递归追溯: `f` 选项能够帮你解决多级链接的问题,一步到位。
可脚本化: 输出内容简单,非常适合在脚本中使用,进行后续的自动化处理。

缺点:

输出信息少: 相对于 `ls l`,它只告诉你指向哪里,不包含链接本身的属性信息。
目标不存在时: 如果链接指向的目标不存在,`readlink f` 会报错。

总结一下,什么时候用哪个?

快速查看,了解链接基本信息: 用 `ls l`。
只想知道链接指向的那个“文件名”或“路径”,特别是需要处理多级链接时: 用 `readlink f`。
写脚本自动化处理链接时: `readlink` 是不二之选,特别是 `f` 选项。

举个更具体的例子:

假设你的当前目录下有:

```
rwrwr 1 user user 1024 Mar 15 10:35 real_file.txt
lrwxrwxrwx 1 user user 15 Mar 15 10:36 link_to_real > real_file.txt
lrwxrwxrwx 1 user user 15 Mar 15 10:37 link_to_link > link_to_real
```

1. 查询 `link_to_real`:
```bash
ls l link_to_real
输出:lrwxrwxrwx 1 user user 15 Mar 15 10:36 link_to_real > real_file.txt

readlink link_to_real
输出:real_file.txt

readlink f link_to_real
输出:/path/to/your/current/dir/real_file.txt (假设你在/path/to/your/current/dir/)
```

2. 查询 `link_to_link`:
```bash
ls l link_to_link
输出:lrwxrwxrwx 1 user user 15 Mar 15 10:37 link_to_link > link_to_real

readlink link_to_link
输出:link_to_real

readlink f link_to_link
输出:/path/to/your/current/dir/real_file.txt (它会自动追溯到最终文件)
```

看到了吧?`readlink f` 确实是解决多级链接问题的神器。

希望这些讲解足够详细,也足够“接地气”,没那些AI味儿。Linux命令的世界就是这么直接有效率,多用、多练,你就能体会到其中的乐趣和强大。

网友意见

user avatar

遇到这种问题,一个正常的具有自主学习能力的人的行为是这样的:

  • 首先用搜索引擎搜索问题关键字

比如google "linux get path of symlink",(下面是我当前的搜索结果):

如果你说我没有科学上网的方法,访问不到google,那用微软的bing.com等搜索引擎也行,这个不墙(下面是我当前的搜索结果):

(别问我为什么不用某度搜索技术类问题,我是不是不爱国,不支持国产?我拒绝回答)

  • 然后从搜索结果里找比较符合自己问题的比较靠谱的条目,点开阅读

即使我无脑打开我上面这两个搜索结果的第一个链接,它们都指向同一个页面,打开看是这样的:

我们几乎一眼可以看到"readlink"命令这个关键字,同时还提到了realpath。但是我们不能对于网上不名来源的“知识”无脑的照搬,我们需要通过自己一定量的调研确认信息的真实可靠性。

  • 接下来阅读readlink的权威文档,了解readlink的细节信息,以及上面示例中给出的命令的明确含义。甚至你可以再用搜索引擎搜索readlink关键字获取更多信息。
       # man readlink  NAME        readlink - print resolved symbolic links or canonical file names ... DESCRIPTION        Note realpath(1) is the preferred command to use for canonicalization functionality.         Print value of a symbolic link or canonical file name         -f, --canonicalize               canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist         -e, --canonicalize-existing               canonicalize by following every symlink in every component of the given name recursively, all components must exist         -m, --canonicalize-missing               canonicalize by following every symlink in every component of the given name recursively, without requirements on components existence ...     

Linux系统过通过man readlink直接查看readlink的文档,我们从中了解到"-f"选项的意思,以及和其相似的-e, -m选项的意思,以及下面更多选项可供我们根据我们遇到的具体问题进行选择。

同时我们还看到一句关于realpath的提示:"Note realpath(1) is the preferred command to use for canonicalization functionality." 结合你在搜索页中看到的信息,综合起来可以大概知道realpath可能是新开发的,比readlink更适合"canonicalization functionality",但是如果你使用特别古老的系统,那么你最好注意一下自己的系统里是否有realpath,如果有就推荐使用,如果没有就用readlink。当然你也可以觉得readlink的兼容性更好些,总之这是你获得一定量的信息后的自我判断。

  • 最后通过你自己的学习和调研,得出你所面对问题的一个合适的解法

比如使用"readlink -f $filename",或者使用realpath。或者适合你所面对的问题的其它合适的方法来follow symlink。

如果通过很多研究学习你仍然对一些深入的地方产生问题,而找不到答案。这时候将你的问题以及你发现问题的过程详细的描述出来,到靠谱的地方提问。比如你读了上面的文档,你发现文档中一直提到“canonical”(或"canonicalization", "canonicalize")这个词。

那这个时候你就应该问自己,"canonical file name"是指什么?单从英语单词的字面意思“标准的文件名”很难知道它具体指什么,那到底什么样的文件名是“canonical”的,什么样的不是?如果你产生这样的提问,那至少说明你迈开了主动学习和思考的第一步了。这时候你就需要对这个问题进行求知。哪怕你把这样的问题拉上来问,我觉得都比这个问题的含金量高一些。当然,你可以直接通过搜索引擎搜索关键字"canonical file names",去看看能不能找到问题的一些合理解释。比如你通过阅读一些搜索结果,了解到这个"canonical file names"针对的是像:

       /foo/bar/aaa/bbb/../../aaa/ccc/../../xxx/file     

这样的路经名来说的,这种就可以理解为非"canonical"的情况,为了"canonicalize(标准化)"这样的路径,就需要用到readlink的"-f, -e, -m"选项了。那应该用哪个呢?就需要你对这三个选项的说明仔细的阅读。很明显我上面那个路径从头到尾都是胡乱写的,我的系统里根本没有这个路径里的任何一个,所以为了"canonicalize"这样一个路径,"-m"选项才是合适的(如果你使用别的选项大概率你什么也得不到):

       $ readlink -m /foo/bar/aaa/bbb/../../aaa/ccc/../../xxx/file /foo/bar/xxx/file     

到此你不光了解了你的问题的一些解决方式,还对解决方式有了一些深入的了解。

不管你从网上得到什么回答,都要保持怀疑和求索的态度(这里的怀疑不是让你抬杠,是让你对自己的知识储备负责,不用你对其它不相干的成年人负责),不能无脑的照单全收。任何人说出来的话都是有局限性和片面性的。

user avatar

用 ls -la 就好了。


       [root@dad5600 ~]# ls -la /usr/lib64/chromium-browser/libffmpeg.so lrwxrwxrwx 1 root root 28 Jan  8 10:35  /usr/lib64/chromium-browser/libffmpeg.so -> /usr/share/code/libffmpeg.so  [root@dad5600 ~]#       




Chromium 浏览器不能播放直播视频怎么办?no valid sources for this video - How to watch ****hub video with Chromium Browser


解决办法很简单。


就是建立一个符号链接,也被称为符号链接或软链接。

这是一种特殊类型的文件,指向另一个文件或目录。


下面将用一条 ln 命令来创建符号链接指向 CODEC 视频解码器 libffmpeg.so:

# ln -s /usr/share/code/libffmpeg.so /usr/lib64/chromium-browser/libffmpeg.so


就这么简单的操作, 就可以让不能正常播放直播视频Chromium 浏览器正常了。





其他测试链接

       https://www.bbc.com/news/av/newsbeat-53818567       



当然, FFMPEG 都没有安装的话, 可以提前用以下命令行


       dnf -y install x265 dnf -y install x264 dnf -y install ffmpeg dnf groupinstall multimedia -y    [root@dad5600 ~]# dnf -y install x265 Last metadata expiration check: 1:47:48 ago on Mon 29 Nov 2021 06:57:42 AM PST. Package x265-3.5-2.fc35.x86_64 is already installed.  [root@dad5600 ~]# dnf -y install x264 Last metadata expiration check: 1:47:52 ago on Mon 29 Nov 2021 06:57:42 AM PST. Package x264-0.163-2.20210613git5db6aa6.fc35.x86_64 is already installed.  [root@dad5600 ~]# dnf -y install ffmpeg Last metadata expiration check: 1:48:07 ago on Mon 29 Nov 2021 06:57:42 AM PST. Package ffmpeg-4.4.1-1.fc35.x86_64 is already installed.     



SEE ALSO

       https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Win_x64/949412/ https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html     


..

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有