尽管存在正确的 MIME 类型,xoj (Xournal) 文件仍被处理为 gzip

尽管存在正确的 MIME 类型,xoj (Xournal) 文件仍被处理为 gzip

所以我不得不卸载苯甲酸 版本期刊并从中构建来源(带有修改)。现在 .xoj 文件会自动使用 KDE 的存档管理器 Ark 打开,当用户从 Dolphin 的右键菜单中选择“属性”时,这些文件会被识别为“Gzip 存档”类型:( Dolphin 的 xoj 属性
之前,.xoj 文件会使用 Xournal 打开,并被正确识别。)尽管存在以下所有情况,但这种情况仍然存在:

1) 复制源包附带的这些文件:
-xournal.xml复制到 /usr/share/mime/packages/
-xournal.desktop复制到 /usr/share/applications/
-x-xoj.desktop复制到 /usr/share/mimelnk/application/

2)将该行添加
application/x-xoj=xournal.desktop;
到 ~/.local/share/applications/mimeapps.list

3)application/x-xoj文件关联系统设置
(具有适当内容):(
文件关联-xoj
还请注意application/x-gzip仅指定.gz 扩展名:
在此处输入图片描述。)

4) 按照建议复制xournal.xml到/usr/share/mime/application
这里

5)sudo update-mime-database /usr/share/mime

6)重新启动计算机

编辑并添加:
7)[右键点击一个.xoj文件]-->打开方式-->其他...-->[选择‘Xournal’],勾选‘记住此类文件的应用程序关联’也是无效的。
編輯結束

这是 Kubuntu 12.04。
那么,我遗漏了什么?

编辑添加
我发现file --mime-type [filename]mimetype [filename]命令会产生不同的结果,例如这个问题

archelon@ingelrayok:~/Documents/xournal$ file --mime-type 2014-02-22-Note-02-09.xoj  
2014-02-22-Note-02-09.xoj: application/x-gzip  
archelon@ingelrayok:~/Documents/xournal$ mimetype 2014-02-22-Note-02-09.xoj  
2014-02-22-Note-02-09.xoj: application/x-xoj  

但是,/etc/mime.types 中没有条目application/x-gzip(该命令据称从中file获取信息);而且,事实上,根据该文件开头的注释,那里也不应该有,其部分内容如下:

注意:诸如“gzip”、“bzip”和“compress”之类的压缩方案实际上不是“mime 类型”。它们是“编码”,因此必须不是此文件中有条目来映射其扩展名。编码文件的“mime 类型”是指已编码的数据的类型,而不是编码的类型。

该评论还说

用户可以根据需要在其主目录中创建“.mime.types”文件来添加自己的类型。其中包含的定义将优先于此处列出的定义。

目前没有这样的文件。我的主目录中有一些文件(我没有创建)显然与命令的输出有关mimetype;这些文件包括
~/.local/share/mime/application/x-xoj.xml
~/.local/share/mime/packages/application-x-xoj.xml
~/.local/share/mime/types仅包含文本的文件application/x-xoj
事实上,目录 ~/.local/share/mime/ 和其中的所有内容都具有相同的时间戳(昨晚 22:19),因此可能是由同一过程生成的。

在查看了模仿类型文件,我决定检查环境变量$XDG_DATA_HOME$XDG_DATA_DIRS,显然前者使用了它们,而后者没有。但我不知道如何报告环境变量的值,所以我尝试了cat $XDG_DATA_HOME,它值(为零)而不是报告它。 编辑以添加:或者我起初是这么认为的;实际上它已经取消设置,正如我们将看到的。正确的命令是echo $XDG_DATA_HOME,正如我从阅读环境变量中了解到的那样这里。然后我发现$XDG_DATA_DIRS设置为/usr/share/default:/usr/local/share/:/usr/share/;其中第一个不存在。我认为这并不重要,但无论如何我运行了命令

XDG_DATA_HOME=$HOME/.local/share  

XDG_DATA_DIRS=/usr/local/share/:/usr/share/  

符合标准。我怀疑这一切都不会有什么不同,但我现在要尝试再次重新启动(尽管我认为那些环境变量无论如何都会自动重置)。下次编辑:是的;事实上变量XDG_DATA_HOME现在又为空了。

无论如何,底线似乎是 KDE 使用的是file正在使用的功能,而不是正在mimetype使用的功能。如果我理解正确的话,这意味着它使用的是 magic 而不是 MIME 类型。我现在怀疑 magic 是造成整个问题的原因。

新编辑

所以file 手册页似乎是说这些是基线魔法文件:

/usr/share/misc/magic.mgc 默认编译的魔法列表。/usr/share/misc/magic
包含默认魔法文件的目录。

(我有这些;/usr/share/misc/magic 是指向空文件夹 /usr/share/file/magic 的链接,而 /usr/share/misc/magic.mgc 是指向文件 /usr/share/file/magic.mgc 的链接 - 后者是一个 2.1 MB 的文件,充满了胡言乱语)和以下文本:

识别这些文件的信息

(即“文件在文件开头附近的特定位置存储有一个‘魔术数字’”)

是从 /etc/magic 和已编译的 magic 文件 /usr/share/misc/magic.mgc 读取的, 如果已编译的文件不存在,
则从目录 /usr/share/misc/magic 中的文件读取。此外, 如果 $HOME/.magic.mgc 或 $HOME/.magic 存在,则会优先使用 系统 magic 文件。


(我已strace按照建议向这里) 我的系统上既不存在 $HOME/.magic.mgc 也不存在 $HOME/.magic ;但是,由于 xoj 文件可能恰好包含导致文件被神奇地识别为 的胡言乱语application/x-gzip,所以创建它们没有任何意义(如果我错了,请纠正我)。

那么,我正在寻找的解决方案就是让 MIME 类型规范覆盖给定文件扩展名的魔法;我以为我见过一些似乎可以提供如何实现这一点的提示的东西,但现在我找不到它。但肯定存在这样的方法。

答案1

这不是答案,只是评论:

尝试过cat $XDG_DATA_HOME,将值设置为(无)而不是报告它

cat当然不会设置变量的值。cat将打印您提供的文件的内容,或者在没有文件名的情况下,它将打印从标准输入读取的内容。此外,变量由您正在运行的 shell 扩展(通常是/bin/bash),因此cat甚至看不到变量的名称。

现在在您的具体情况下,变量似乎没有设置,因此扩展为无,因此cat没有参数,因此cat从 stdin 打印,我假设您必须Ctrl-C-end 它,或者可能是Ctrl-D(文件结束)。

相关内容