如何从python中读取,更改和编写macOS文件别名

时间:2018-02-19 08:31:26

标签: python macos file alias

有没有办法读取macOS文件别名,修改其内容(特别是目标文件路径),然后将修改后的别名写回来?

例如,如果我有以下目录结构:

./one/file.txt
./two/file.txt
./file_alias

其中file_alias解析为./one/file.txt。我希望能够以编程方式在Python中读取./file_alias,确定其路径,将“one”更改为“two”,并将修改后的别名写出来,覆盖./file_alias。完成后,file_alias将解析为./two/file.txt

搜索我找到了一个相关问题的答案,表明它无法完成(@ Milliway对[1]的回答),一个没有实质性文档的碳模块和一个已删除其功能的声明[2] ],一个部分弃用的macostools模块依赖于Carbon [3],一个等效的,未解决的问题(除了暂定的建议使用PyObjC)[4],以及最近更新的mac_alias包[5],但还没有找到办法基于这些任务完成任务。

mac_alias包起初看起来很有趣,但是我发现没有办法从现有的别名文件中导入构造内存中Alias对象所需的字节数(使用来自别名文件的二进制读取的字节)产生错误)即使我可以构造一个内存中的Alias记录并对其进行修改,也无法将其写入磁盘。

我想要的机器运行10.12.x(Sierra),我使用的是内置的python 2.7.10。我发现我实际上可以导入Carbon和macostools,并怀疑Carbon.File可能会提供我需要的东西,但我找不到任何文档。我可以升级到High Sierra和/或安装和使用Python 3.x,但是在这个阶段似乎没有帮助或相关。

我意识到别名还包含一个inode,在这样的改变之后会变得陈旧,但幸运的是,部分原因是由于我提交的一个错误以及我在使用Apple时的一些持久性,别名解决了路径首先,如果路径无法解析,则仅回退到inode,如果路径确实解析(并且inode已更改),则更新inode。

任何帮助,建议和赞赏。

[1] How to handle OSX Aliases in Python with os.walk()?
[2] https://docs.python.org/2/library/carbon.html
[3] https://docs.python.org/2/library/macostools.html
[4] change an alias target python
[5] https://pypi.python.org/pypi/mac_alias

2 个答案:

答案 0 :(得分:1)

使用PyObjC解决了它,尽管几乎没有PyObjC的文档。您必须使用this site中的“PyObjC简介”中描述的技术仔细地将NSURL的ObjectiveC接口转换为PyObjC调用,同时引用here所述的NSURL接口。

@ MagerValp对this question的回复中的代码帮助弄清楚如何获得别名的目标。我必须弄清楚如何使用修订后的目标创建一个新的别名。

以下是包含并执行所需功能的测试程序。它的设置和使用都记录在代码中的注释中。

我是一个坏人,并没有做文档字符串或输入和返回值的描述,但我保持所有函数简短和单功能,并希望我已经足够清楚地命名所有变量和函数,他们不需要。 CamelCaps和underscore_separated变量和函数名称确实很奇怪。我通常使用CamelCaps作为全局常量和函数和变量的underscore_separated名称,但在这种情况下,我想保留PyObjC调用中引用的变量和数据类型,使用camelCaps,不变,因此奇怪的混合。

请注意,Mac Finder会缓存一些有关别名的信息。因此,如果您在运行此程序后立即在file_alias上执行获取信息或解析,则看起来它不起作用,即使它确实如此。您必须将one文件夹拖到废纸篓清空废纸篓,然后只有获取信息或解析file_alias才会显示它确实现在指向{ {1}}。 (抱怨,发牢骚。)幸运的是,这不会影响我对这些技术的使用,也不会影响大多数人的使用,我怀疑。程序的重点通常是用一个固定的别名替换一个破坏的别名,这是基于一个单一的,简单的东西改变了这个事实,比如这个例子中的文件夹名称,或者我真实应用程序中的卷名。 / p>

最后,代码:

./two/file.txt

答案 1 :(得分:0)

这个帖子引起了我的兴趣...

但我不认为这是可能的。

在mac_alias中查看此错误报告:https://github.com/al45tair/mac_alias/issues/4

它注意到该包处理Alias 记录而不是别名文件。 Alias文件是第3版,尚未进行逆向工程。

它指向Alias文件中的此信息:http://indiestack.com/2017/05/resolving-modern-mac-alias-files/

此线程也在他们的旧bitbucket上:https://bitbucket.org/al45tair/mac_alias/issues/3/support-for-version-3-aliases

指向此死页(感谢,archive.org)https://web.archive.org/web/20170222235430/http://sysforensics.org/2016/08/mac-alias-data-objects/

并且有信息可以通过这个包阅读一些信息:https://pypi.python.org/pypi/plistutils/其中有一堆文档在他们的github上读取别名结构

这一切都不是你想要的。遗憾。