表示文件系统的可编辑校验和索引的最佳方式是什么?
What's the best way to represent an editable checksum index of a filesystem?
给定任何文件,我想识别具有相同校验和的重复文件。我只是想将重复项的文本列表打印到我的终端,所以 运行 一个完整的桌面搜索索引器绝对是矫枉过正。
为了做我想做的事,我需要关联存储两条信息:
"[此文件] 具有 <XYZ 校验和>",对于任何 文件
[这里是所有文件] <XYZ 校验和>,任何 校验和
要注意的是我需要将数据库设置为 editable 以便在我移动数据时 - 并通知管理数据库的脚本 - 它可以跟上更改。我想到了两种方法来做到这一点。
一种方法是使用基于偏移量的平面文件索引,但我需要实施分段方案,以便在数据四处移动时可以使用新文件扩展目录表示,而不必不断地向前移动整个文件并向后适应数据重组。
虽然这对我来说并非不可能,但这将是非常重要的,我会担心数据库的一致性和完整性,并且由于我会决定是否删除这些信息背后的数据,所以我会玩这样的在我决定使用它之前实施了一段时间。
我没有使用传统数据库的经验,但我想 SQL 可能比我自己实现整个存储框架更容易地实现我想要做的事情。如果这是一个选项,那么从哪里开始比较好?我初步推测我可以创建两个 tables:第一个将在第一列(主)列中列出每个校验和,并在第二列中列出该校验和匹配的每个文件的 NUL 分隔字符串;第二个 table 将在 first/primary 列中列出文件的完整路径,并在第二个列中列出其校验和。更新这个系统需要我在两个 table 中简单地修改一个列,并且比上面建议的方法显着 simpler/easier。
您需要一个包含 2 列的数据库 table:File
和 ChecSum
。文件(显示为完整路径)本质上是 UNIQUE
,可以用作 UNIQUE INDEX
。您可能仍想将 ID
字段(整数代码)添加为 PRIMARY KEY
,特别是如果您希望将 moving
或 renaming
视为单个操作而不是将其拆分为delete
后跟 create
。
在 MySQL 中(用作示例)您将得到类似这样的内容(没有 ID
列):
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';
给定任何文件,我想识别具有相同校验和的重复文件。我只是想将重复项的文本列表打印到我的终端,所以 运行 一个完整的桌面搜索索引器绝对是矫枉过正。
为了做我想做的事,我需要关联存储两条信息:
"[此文件] 具有 <XYZ 校验和>",对于任何 文件
[这里是所有文件] <XYZ 校验和>,任何 校验和
要注意的是我需要将数据库设置为 editable 以便在我移动数据时 - 并通知管理数据库的脚本 - 它可以跟上更改。我想到了两种方法来做到这一点。
一种方法是使用基于偏移量的平面文件索引,但我需要实施分段方案,以便在数据四处移动时可以使用新文件扩展目录表示,而不必不断地向前移动整个文件并向后适应数据重组。
虽然这对我来说并非不可能,但这将是非常重要的,我会担心数据库的一致性和完整性,并且由于我会决定是否删除这些信息背后的数据,所以我会玩这样的在我决定使用它之前实施了一段时间。
我没有使用传统数据库的经验,但我想 SQL 可能比我自己实现整个存储框架更容易地实现我想要做的事情。如果这是一个选项,那么从哪里开始比较好?我初步推测我可以创建两个 tables:第一个将在第一列(主)列中列出每个校验和,并在第二列中列出该校验和匹配的每个文件的 NUL 分隔字符串;第二个 table 将在 first/primary 列中列出文件的完整路径,并在第二个列中列出其校验和。更新这个系统需要我在两个 table 中简单地修改一个列,并且比上面建议的方法显着 simpler/easier。
您需要一个包含 2 列的数据库 table:File
和 ChecSum
。文件(显示为完整路径)本质上是 UNIQUE
,可以用作 UNIQUE INDEX
。您可能仍想将 ID
字段(整数代码)添加为 PRIMARY KEY
,特别是如果您希望将 moving
或 renaming
视为单个操作而不是将其拆分为delete
后跟 create
。
在 MySQL 中(用作示例)您将得到类似这样的内容(没有 ID
列):
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';