表示文件系统的可编辑校验和索引的最佳方式是什么?

What's the best way to represent an editable checksum index of a filesystem?

给定任何文件,我想识别具有相同校验和的重复文件。我只是想将重复项的文本列表打印到我的终端,所以 运行 一个完整的桌面搜索索引器绝对是矫枉过正。

为了做我想做的事,我需要关联存储两条信息:

  1. "[此文件] 具有 <XYZ 校验和>",对于任何 文件

  2. [这里是所有文件] <XYZ 校验和>,任何 校验和

要注意的是我需要将数据库设置为 editable 以便在我移动数据时 - 并通知管理数据库的脚本 - 它可以跟上更改。我想到了两种方法来做到这一点。

一种方法是使用基于偏移量的平面文件索引,但我需要实施分段方案,以便在数据四处移动时可以使用新文件扩展目录表示,而不必不断地向前移动整个文件并向后适应数据重组。
虽然这对我来说并非不可能,但这将是非常重要的,我会担心数据库的一致性和完整性,并且由于我会决定是否删除这些信息背后的数据,所以我会玩这样的在我决定使用它之前实施了一段时间。

我没有使用传统数据库的经验,但我想 SQL 可能比我自己实现整个存储框架更容易地实现我想要做的事情。如果这是一个选项,那么从哪里开始比较好?我初步推测我可以创建两个 tables:第一个将在第一列(主)列中列出每个校验和,并在第二列中列出该校验和匹配的每个文件的 NUL 分隔字符串;第二个 table 将在 first/primary 列中列出文件的完整路径,并在第二个列中列出其校验和。更新这个系统需要我在两个 table 中简单地修改一个列,并且比上面建议的方法显着 simpler/easier。

您需要一个包含 2 列的数据库 table:FileChecSum。文件(显示为完整路径)本质上是 UNIQUE,可以用作 UNIQUE INDEX。您可能仍想将 ID 字段(整数代码)添加为 PRIMARY KEY,特别是如果您希望将 movingrenaming 视为单个操作而不是将其拆分为delete 后跟 create

在 MySQL 中(用作示例)您将得到类似这样的内容(没有 ID 列):

DDL and DML:

CREATE TABLE Files
    (`File` varchar(16), `CheckSum` int)
;

ALTER TABLE Files ADD UNIQUE INDEX (File), ADD INDEX (CheckSum);

INSERT INTO Files
    (`File`, `CheckSum`)
VALUES
    ('\dir1\file1', 56789),
    ('\dir2\file2', 77777),
    ('\dir3\dir4\file9', 56789),
    ('\dirA\file1', 12345)
;

DOL:

-- All files
SELECT * 
FROM Files;

-- All files with checksum = 56789
SELECT * 
FROM Files
WHERE checksum = 56789;

-- File name '\dirA\file1'
SELECT *
FROM Files 
WHERE file = '\dirA\file1';

SQL Fiddle with the above