Contents

如何查找特定文件的所有链接

1. 概述

创建符号链接 可以让我们更灵活地访问文件,即使目标文件位于不同的文件系统中。在某些情况下,我们需要找到所有这些链接来解决磁盘空间问题,甚至修复损坏的问题。

在本教程中,我们将了解如何查找特定文件的所有软链接。

2. 设置

假设我们在当前工作目录下有dir1目录和file1.txt文件。此外,我们使用*ln *命令在指向文件和目录的多个目录上创建了多个符号链接:

[itcodingman@blogdemo:~/test]$ ls -lrth
total 12K
-rw-r--r-- 1 mogamal mogamal   11 Jun 11 16:50 file1.txt
drwxr-xr-x 4 mogamal mogamal 4.0K Jun 11 16:50 dir1
[itcodingman@blogdemo:/tmp]$ ln -s ~mogamal/test/file1.txt filelink
[itcodingman@blogdemo:/tmp]$ ln -s ~mogamal/test/dir1 dirlink
[itcodingman@blogdemo:/tmp]$ ls -lrth
total 49M
lrwxrwxrwx 1 mogamal mogamal   28 Jun 11 16:52 filelink -> /home/mogamal/test/file1.txt
lrwxrwxrwx 1 mogamal mogamal   28 Jun 11 16:52 dirlink -> /home/mogamal/test/dir1
...

我们的目标是找到映射到 file1.txt 和 dir1 的所有链接。

有几种方法可以实现这一目标。接下来,让我们详细看看它们。

3. 使用find命令

find 命令提供了 多个 选项来查找所有链接。接下来,让我们尝试使用这些选项查找目标文件和目录的链接。

3.1. 按确切文件名查找

我们可以通过在find命令中添加*-L-samefile*选项来查找并跟踪映射到 file1.txt 的所有链接:

[itcodingman@blogdemo:~/test]$ find -L / -samefile file1.txt
/home/mogamal/test/file1.txt
/tmp/filelink
/opt/filelink2
/srv/filelink3
find: ‘/etc/polkit-1/localauthority’: Permission denied

正如您在上面看到的,使用选项*-samefile*我们添加我们的文件名或目录。

使用根目录 “/” 作为工作目录在任何地方执行搜索。

很好,它有效。已找到所有file1.txt链接。

为了更好的可读性,我们可以使用重定向 将诸如“permission denied”之类的错误重定向到*/dev/null*空间:

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

3.2. 按索引节点号查找

当我们在 Linux 文件系统上工作时,它使用inode 号来存储有关文件的信息。当我们列出文件夹中的文件时,我们会看到指向 inode 的链接。一个 inode 可以有多个链接,这些链接可以是 符号链接或硬链接 。我们可以在文件上使用 stat  并查看它指的是哪个 inode:

[itcodingman@blogdemo:~/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。

让我们使用find命令和指向文件 inode 的 -inum操作:

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

太好了,file1.txt的所有链接都找到了。

3.3. 递归查找

** find 命令提供了一个*-type*选项,允许指定多种类型**。当我们将类型指定为小 L(链接的 l )时,它会显示指定路径中的所有软链接:

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

然后我们可以附加  -ls选项来列出链接的完整属性:

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

最后,我们可以使用grep 命令来匹配file1.txtdir1的文件名模式:

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