当前位置: 首页 > 科技观察

如何在Linux上识别文件重复

时间:2023-03-19 23:17:46 科技观察

Linux系统上的某些文件可能出现在多个位置。按照本文中的说明查找和识别这些“同卵双胞胎”,并了解为什么硬链接如此有益。识别使用相同磁盘空间的文件依赖于利用文件使用相同inode的事实。该数据结构存储除文件名和内容之外的所有信息。如果两个或多个文件具有不同的名称和文件系统位置,但共享一个inode,则它们也共享内容、所有权、权限等。这些文件通常称为“硬链接”,不同于符号链接(即软链接)仅通过包含它们的名称来指向其他文件,符号链接很容易在文件列表的第一个位置传递并引用该文件->符号被识别。$ls-lmy*-rw-r--r--4shsshs228Apr1219:37myfilelrwxrwxrwx1shsshs6Apr1511:18myref->myfile-rw-r--r--4shsshs228Apr1219:37mytwin在单个目录中的硬链接不是很明显,但仍然很容易找到。如果您使用ls-i命令列出按inode编号排序的文件,您可以很容易地挑选出硬链接。在这种类型的ls输出中,***列显示inode编号。$ls-i|排序-n|更多...788000myfile<==788000mytwin<==801865Name_Labels.pdf786692永远不要生气离开家920242NFCU_Docs800247nmap-notes扫描输出,寻找相同的inode编号,任何匹配都会告诉你想知道的。另一方面,如果你只是想知道一个特定文件是否是另一个文件的硬链接,有一种比浏览数百个文件的列表更简单的方法,find命令的-samefile选项可以完成这项工作为你。$找到。-samefilemyfile./myfile./save/mycopy./mytwin请注意,提供给find命令的起始位置决定了将扫描多少文件系统以查找匹配项。在上面的示例中,我们正在查看当前目录和子目录。使用find的-ls选项向输出添加更多细节可能更有说服力:$find。-rw-r--r--4shsshs228Apr1219:37./save/mycopy7880004-rw-r--r--4shsshs228Apr1219:37./mytwin***列显示inode编号,然后我们看到文件权限、链接、所有者、文件大小、日期信息以及引用相同磁盘内容的文件名。请注意,在这种情况下,链接字段是“4”而不是我们预期的“3”。这告诉我们还有另一个链接指向同一个inode(但不在我们的搜索中)。如果你想在一个目录中找到所有的硬链接实例,试试下面的脚本来创建一个列表并为你找到重复的:#!/bin/bash#seachesforfilessharinginodesprev=""#listfilesbyinodeles-我|sort-n>/tmp/$0#在文件中搜索重复的inode#swhilereadlinedoinode=`echo$line|awk'{print$1}'`if["$inode"=="$prev"];然后grep$inode/tmp/$0fiprev=$inodedone/dev/null7880004-rw-r--r--4shsshs228Apr1219:37/tmp/mycopy7880004-rw-r--r--4shsshs228Apr1219:37/home/shs/myfile7880004-rw-r--r--4shsshs228Apr1219:37/home/shs/save/mycopy7880004-rw-r--r--4shsshs228Apr1219:37/home/shs/mytwin请注意,错误输出被重定向到/dev/null,这样我们就不必查看所有“权限被拒绝”错误,否则出现在我们不允许查看的其他目录中。此外,扫描包含相同内容但不共享inode(即简单文本副本)的文件将花费更多时间和精力。