在 Linux 上查找特定文件的所有链接

linuxopen sourceoperating system更新于 2026/1/27 17:52:17

概述

在本教程中,我们将学习如何在 Linux 上查找特定文件的所有链接。我们将使用命令 lsof 列出任何进程打开的所有文件,然后使用 grep 筛选出包含指向目标文件的链接的文件。

什么是链接?

Unix/Linux 系统中的链接是两个不同文件或目录之间的关联。创建链接时,它会为原始文件或目录创建一个新名称。您可以通过链接文件的别名访问它,而不是直接访问原始文件。例如,如果您创建一个名为"test"的符号链接,指向 /home/user/Desktop/file1.txt,则可以使用 test 而不是 Desktop/file1.txt 来访问该文件。

设置

我们有一个 dir1 文件夹和一个 file1.txt 文档。我们使用 ln 命令创建了多个从不同文件夹指向该文本文档和该文件夹的符号链接。

[tpoint@server1:~/test]$ ls -lrth
total 12K
-rw-r--r-- 1 tpoint tpoint11 Jun 11 16:50 file1.txt
drwxr-xr-x 4 tpoint tpoint4.0K Jun 11 16:50 dir1
[tpoint@server1:/tmp]$ ln -s ~tpoint/test/file1.txt filelink
[tpoint@server1:/tmp]$ ln -s ~tpoint/test/dir1 dirlink
[tpoint@server1:/tmp]$ ls -lrth
total 49M
lrwxrwxrwx 1 tpoint tpoint28 Jun 11 16:52 filelink -> /home/tpoint/test/file1.txt
lrwxrwxrwx 1 tpoint tpoint28 Jun 11 16:52 dirlink -> /home/tpoint/test/dir1
...

我们想要识别所有映射到 file1.txt 或 dir1 的链接。

您可以使用几种不同的方法来实现这一点。现在,我们将详细介绍每一种方法。

使用 find 命令

find 选项允许您查找文档中的所有链接。现在,让我们看看能否使用这两个过滤器找到有用的链接目标。

按精确文件名查找

为了定位并跟踪所有名为 file1.txt 的超链接文件,我们在 grep 命令中添加了 -L 选项 -

[tpoint@server1:~/test]$ find -L / -samefile file1.txt
/home/tpoint/test/file1.txt
/tmp/filelink
/opt/filelink2
/srv/filelink3
find: '/etc/polkit-1/localauthority': Permission denied

使用 -samefile 开关,我们将文件名或文件夹路径添加到命令行。搜索将在所有目录执行,并以根目录 (/) 作为工作目录。

太棒了!成功了。现在所有 file1.txt 链接都已找到。

我们可以使用重定向来发送错误消息,例如对 /dev/null 的权限被拒绝。

[tpoint@server1:~/test]$ find -L / -samefile file1.txt 2> /dev/null
/home/tpoint/test/file1.txt
/tmp/filelink
/opt/filelink2
/srv/filelink3

通过 Inode 编号查找

在 Linux 文件系统(例如 ext4)上工作时,它使用 Inode 存储文件信息。我们通过列出文件在内存中的位置(Inode)来列出目录中的文件。每个 Inode 都有多个链接,这些链接可以是符号链接,也可以是硬链接。我们可以通过查看文件的 Inode 来判断文件是否被修改过。

[tpoint@server1:~/test]$ stat file1.txt
File: file1.txt
Size: 11 Blocks: 8 IO Block: 4096 regular file
Device: 810h/2064d Inode: 94804 Links: 1

此 file1.txt 存储在 inode 编号 94804 处。

我们使用带有 '-inum' 选项的 'find' 命令,该选项指向我们要删除的文件的 inode 编号。

[tpoint@server1:~/test]$ find -L / -inum 94804 2> /dev/null
/home/tpoint/test/file1.txt
/tmp/filelink
/opt/filelink2
/srv/filelink3

已找到 file1.text 的所有链接。

通过递归方法查找

-type 选项允许提供多种文件类型规范。如果我们将类型指定为"small L",则会显示给定目录中的所有软链接。

[tpoint@server1:~/test]$ find / -type l
/home/tpoint/test/dir1/certs/Buypass_Class_2_Root_CA.pem
/home/tpoint/test/dir1/certs/3fb36b73.0
/home/tpoint/test/dir1/certs/0f5dc4f3.0
...

然后我们可以附加 -ls 选项来显示每个链接的完整属性。

[tpoint@server1:~/test]$ find / -type l -ls 2> /dev/null | more
94809 0 lrwxrwxrwx 1 tpoint tpoint 23 Jun 11 17:11 /tmp/dirlink -> /home/tpoint/test/dir1
94805 0 lrwxrwxrwx 1 tpoint tpoint 28 Jun 11 16:52 /srv/filelink -> /home/tpoint/test/file1.txt
94808 0 lrwxrwxrwx 1 tpoint tpoint 28 Jun 11 17:00 /tmp/filelink2 -> /home/tpoint/test/file1.txt
94810 0 lrwxrwxrwx 1 tpoint tpoint 24 Jun 11 17:11 /srv/dirlink2 -> /home/tpoint/test/dir1/
...

最后,我们可以使用 `grep` 命令搜索与特定文件名模式(file1.txt 或 dir/dir1)匹配的文件。

[tpoint@server1:~/test]$ find / -type l -ls 2> /dev/null | grep dir1
94809 0 lrwxrwxrwx 1 tpoint tpoint 23 Jun 11 17:11 /tmp/dirlink -> /home/tpoint/test/dir1
94810 0 lrwxrwxrwx 1 tpoint tpoint 24 Jun 11 17:11 /srv/dirlink2 -> /home/tpoint/test/dir1/
...

总结

本文介绍了查找文件或目录所有硬链接的不同方法,以及如何使用 find 命令行参数来实现这一点。


相关文章


有用资源