在 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 命令
查找选项允许您查找文档中的所有链接。现在让我们看看是否可以通过使用这两个过滤器找到任何有用的链接目标。
按确切文件名查找
要找到并跟踪所有名为 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
按索引节点编号查找
在 Linux 文件系统(如 ext4)上工作时,它使用 inode 存储有关文件的信息。我们通过列出文件在内存中的位置(in-odes)来列出目录中的文件。每个 in−ode 都有多个链接,可以是符号链接,也可以是硬链接。我们可以通过查看文件的 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
此文件1.txt存储在索引节点编号94804处。
让我们使用带有“−inum”选项的“find”命令,该选项指的是我们要删除的文件的索引节点。
[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/ ...
结论
在这里,我们介绍了查找文件或目录的所有硬链接的不同方法,以及如何使用查找命令行参数来实现此目的。