在 Linux 上查找特定文件的全部链接
概述
在本教程中,我们将学习如何在 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 的超链接文件,我们将 −L 选项添加到 grep 命令中 −
[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 选项允许提供多个文件类型规范。如果我们将类型指定为“小写 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 命令行参数来实现。