如何查找特定文件的所有链接
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.txt或dir1的文件名模式:
[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/
...