5

我正在寻找一个位于文件顶部的元数据层,它可以解释文件名中的键值对信息,用于处理数千个文件的应用程序。更多信息:

  • 这些不一定是具有内置元数据的媒体文件 - 因此是键值对。
  • 元数据超出了操作系统信息(文件大小等)——应用程序放入键值的任何内容。
  • 它应该可以通过命令行和 python 模块访问,以便我的应用程序可以与之对话。
  • 添加:它也应该被常见的 os 命令(cp、mv、tar 等)支持,以便在复制或移动文件时不会丢失。

我想要的功能示例包括:

  • 列出组织 ID 3375 的目录 x 中的文件
  • 通过将 load_time 转换为年/月并显示每个年/月组合的文件计数和大小来报告目录 y 中的文件
  • 根据加载时间的键获取目录 z 中最旧的文件

嵌入了这些简单元数据的文件可能如下所示:

  • Bowling_state-ky_league-15_game-8_gametime-201209141830.tgz
  • Bowling_state-ky_league-15_game-9_gametime-201209141930.tgz

此元数据非常易于访问并与文件紧密结合。但是 - 我宁愿避免在所有操作中都使用剪切或通配符。

我环顾四周,只能找到媒体和操作系统元数据解决方案,如果它已经存在,我不想构建它。

4

3 回答 3

3

你看过扩展文件属性吗?请参阅:http ://en.wikipedia.org/wiki/Extended_file_attributes

基本上,您将键值对作为零终止字符串存储在文件系统本身中。您可以像这样从命令行设置这些属性:

$ setfattr -n user.comment -v "this is a comment" testfile
$ getfattr testfile
# file: testfile
user.comment
$ getfattr -n user.comment testfile
# file: testfile
user.comment="this is a comment"

要从 python 设置和查询扩展文件系统属性,可以尝试 python 模块 xattr。见: http: //pypi.python.org/pypi/xattr

EDIT 大多数文件系统操作命令都支持扩展属性,例如通过添加命令行标志的 cp、mv 和 tar。例如 cp -a 或 tar --xattr。您可能需要使这些命令透明地工作。(您可能有些用户不知道您的扩展属性。)在这种情况下,您可以创建一个别名,例如 alias cp="cp -a"。

于 2012-09-14T23:58:56.597 回答
2

如前所述,xattrs 在可用时是一个很好的解决方案。但是,当您不能使用 xattrs 时:

NTFS 备用数据流

在 Microsoft Windows 上,xattrs 不可用,但NTFS 备用数据流提供了类似的功能。ADS 允许您将任意数量的数据与文件的主要流一起存储。它们是使用

drive:\path\to\file:streamname

ADS 实际上只是它自己的具有特殊名称的文件。显然,您可以通过指定包含冒号的文件名从 Python 访问它们:

open(r"drive:\path\to\file:streamname", "wb")

然后像普通文件一样使用它。(免责声明:未经测试。)

从命令行,使用微软的streams程序。

由于 ADS 存储任意二进制数据,因此您负责编写查询功能。

SQLite

SQLite 是您可以使用的嵌入式 RDBMS。将.sqlite数据库文件存储在目录树旁边。

对于您添加的每个文件,还要将每个文件记录在一个表中:

CREATE TABLE file (
    file_id INTEGER PRIMARY KEY AUTOINCREMENT,
    path TEXT
);

然后,例如,您可以将一段元数据存储为表:

CREATE TABLE organization_id (
    file_id INTEGER PRIMARY KEY,
    value INTEGER,
    FOREIGN KEY(file_id) REFERENCES file(file_id)
);

然后你可以查询它:

SELECT path FROM file NATURAL JOIN organization_id
WHERE value == 3375 AND path LIKE '/x/%';

或者,如果您想要一个纯键值存储,您可以将所有元数据存储在一个表中:

CREATE TABLE metadata (
    file_id INTEGER,
    key TEXT,
    value TEXT,
    PRIMARY KEY(file_id, key),
    FOREIGN KEY(file_id) REFERENCES file(file_id)
);

询问:

SELECT path FROM file NATURAL JOIN metadata
WHERE key == 'organization_id' AND value == 3375 AND path LIKE '/x/%';

显然,每当您读取或写入文件时,您都有责任更新数据库。您还必须确保这些更新是原子的(例如active,向file表中添加一列;添加文件时:set active = FALSE、write file、fsync、setactive = TRUE和 as cleanup 删除任何具有 的文件active = FALSE)。

  • Python 标准库包含 SQLite 支持作为sqlite3包。
  • 从命令行,使用该sqlite3程序。
于 2012-09-15T02:35:53.563 回答
0

Xattr 对大小的限制(Ext4 最多 4kb),xattr 键必须以“用户”为前缀。在 Linux 上。并不是所有的文件系统都支持 xattr。

尝试包装 xattr 并可以轻松切换以禁用 xattr 支持的iDB.py库。

于 2012-10-24T00:11:18.110 回答