Mac 备忘录( Notes)里笔记被永久删除后的找回方法

2017-06-05 16:30:06 +08:00
 Sylv

昨天想要在 iPhone 备忘录( Notes )里恢复一个误删的笔记,当时这笔记还保留在“最近删除”( Recently Deleted )文件夹里,但是一时恍惚手抖又误点了下删除键(居然没有二次确认提醒😢),导致这笔记在备忘录里就被永久删除了。

笔记的内容挺重要的,所以我立马打开了 Mac,想趁着 iCloud 将删除操作同步到 Mac 上的备忘录前救回被删笔记,可惜就在我解锁屏幕、断 WiFi 的瞬间,iCloud 已经完成了同步,Mac 备忘录里对应的笔记也被删除掉了。

之后我抱着死马当活马医的心情折腾了一番尝试有没有其它办法可以恢复笔记,幸运的是,无意中还真让我发现了个在 Mac 上找回已删笔记的方法。在这里分享出来,希望能帮助到日后遇到同样问题的朋友。

找回方法

用 Finder 打开以下目录:

~/Library/Containers/com.apple.Notes/Data/Library/CoreData/ExternalRecords/NotesV4/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX[32 位随机码]/ICNote/_records/

此目录下有一些以数字编号的文件夹:

每个文件夹里有多个 .notesexternalrecord 后缀的文件:

这些 External Notes Record 文件是 0 字节的空文件,本身没有存储任何内容:

但是很神奇的是,这些 0 字节的 .notesexternalrecord 文件是可以按空格键来“快速预览”( Quick Look )的,而每个 .notesexternalrecord 文件"快速预览"显示的内容就对应了备忘录里的一个笔记:

这些 .notesexternalrecord 文件似乎是备忘录程序的某种索引(经测试,文件名是索引的 Key ),双击文件也可以唤出备忘录里的对应笔记。

重点是,备忘录里被永久删除了的笔记所对应的 .notesexternalrecord 文件仍旧被保留在了这些文件夹里,并没有被删除,而且仍然可以用空格键“快速预览”查看到被删除的内容(但双击后没法在备忘录里唤出对应笔记)。

也就是说备忘录里被永久删除的笔记实际上仍旧被保留在了程序内部数据库里(可能只是暂时保留),而这些遗留的 .notesexternalrecord 索引文件提供了一种查看其内容的途径,因此可以用此方法来找回被删的笔记。

另外,如果仍记得被删笔记里的部分关键词,是可以用 Finder 在 _records 目录下用关键词搜索到对应的 .notesexternalrecord 文件的,这样就不用一个一个文件找了:

不过,这个“找回方法”只能在“快速预览”里“看”到被删除笔记的内容,因为“快速预览”不支持复制,所以没法直接将内容复制出来。除了再手打一遍这个笨方法以外,还有一个解决方法是截图后,使用各种在线或本地的 OCR 工具将文本内容识别出来,虽然或多或少会有一些识别错误需要手动更正,但至少还是把笔记内容找回来了。

30696 次点击
所在节点    macOS
23 条回复
Mirage09
2017-06-05 16:49:06 +08:00
厉害了
xiubin
2017-06-05 17:08:03 +08:00
厉害了沃德锅
orzfly
2017-06-05 17:19:21 +08:00
看起来是 Resource Fork,就不具体讨论这是什么了……

不过我有个简单的办法不妨试一下,用 Mac Finder 自带的 ZIP 压缩( Finder 中右键菜单中的 Compress ),给这个文件创建一个压缩包。然后去终端下用 unzip 解压出来,会多出一个 __MACOSX,其中存储了该文件的 Resource Fork 中的数据。

比如:

$ unzip ../a.zi
Archive: ../a.zip
extracting: a.textClipping
creating: __MACOSX/
inflating: __MACOSX/._a.textClipping
$ file __MACOSX/._a.textClipping
__MACOSX/._a.textClipping: AppleDouble encoded Macintosh file

至于这个文件是什么编码我也不太懂,不过你说不定直接 cat 一下就看到内容了,你的文字可能混在一堆东西里,但是不管怎么样你的数据出来了?

(顺便,你可以从任何一个 Cocoa 支持拖动的文本框中拖动一段话到桌面上,会产生一个 .textClipping 的文件,他的内容就是这样,本身 0 字节,但是内容存在 Resource Fork 里)
orzfly
2017-06-05 17:21:02 +08:00
你的文字数据可能是用 UTF-8/UTF-16BE 编码存储的,反正可以都试一下嘛……
KDF
2017-06-05 17:22:39 +08:00
666
orzfly
2017-06-05 17:27:03 +08:00
不创建压缩包的话可以搜一搜 Resource Fork 是啥,然后会发现一个叫做 xattr 的工具可以读出来……

$ xattr -p com.apple.ResourceFork a.textClipping | xxd -p -r
orzfly
2017-06-05 17:28:22 +08:00
顺带一提,系统自带的 ls 有 -@……

$ /bin/ls -l@ *.textClipping
-rw-r--r--@ 1 orzfly staff 0 Jun 5 17:12 a.textClipping
com.apple.FinderInfo 32
com.apple.ResourceFork 564
-rw-r--r--@ 1 orzfly staff 0 Jun 5 17:18 abc.textClipping
com.apple.FinderInfo 32
com.apple.ResourceFork 2693
chengfu
2017-06-05 17:38:06 +08:00
难道不是拷贝出来后缀改成 txt !(逃(^-^)
zyllwy
2017-06-05 17:46:35 +08:00
厉害了沃德锅
ashfinal
2017-06-05 18:59:34 +08:00
0 字节还能预览出内容?
自己按照楼主方法试了下,并不行。还有谁尝试成功了?
Sylv
2017-06-06 04:46:05 +08:00
@orzfly
按你说的方法试了下,确实解压出了个 __MACOSX 文件夹下的 Resource Fork 文件,不过此文件里并没有包含笔记的内容,里面只是些和内容无关的文件扩展属性值:


所以笔记的具体内容应该还是保存在备忘录程序的另外一个数据库文件里(稍微查了下,好像是个加密的 SQLite 文件),而这些 .notesexternalrecord 文件只是单纯的某种索引文件,用来定位备忘录里的具体笔记。
Sylv
2017-06-06 05:01:06 +08:00
@ashfinal
请问你在这些 .notesexternalrecord 文件上按空格键“快速预览”后显示的是什么呢?能否截个图看看?

我刚在另外一台旧电脑上试了下也是可行的,所以这个方法应该不是我电脑上的特例。不过两台电脑用的都不是最新的 macOS Sierra 10.12,一台是 OS X El Capitan 10.11.6,另一台是 OS X Yosemite 10.10.5。不知你用的是不是新系统?这个其实可以算是备忘录( Notes )程序的一个漏洞,所以有可能新系统已经将其修复掉了,那这个“找回方法”可能在新系统下已经失效了,可惜手头没有运行 macOS Sierra 的电脑可以亲自确认下。
ashfinal
2017-06-06 11:52:17 +08:00
@Sylv 预览就是空白窗体。效果和你 `touch new.txt` 一样的。
系统是最新的,所以估计这个漏洞已经被修复了。
CrazyBob589
2017-12-10 14:54:15 +08:00
@Sylv 抱歉隔了那么久回帖,我想问一下,如果 iPhone 也遇到了同样的情况,有办法找回吗?我昨天 iPhone 备忘录抽风闪退,里边保存的几百条备忘录全没了,iCloud 和邮箱里也没备份,但是 Spotlight 里全都能通过关键字搜到相应的被抽掉的备忘录
Sylv
2017-12-10 15:25:28 +08:00
@CrazyBob589 如果没有同步到 Mac 上的话,估计很难找回了,毕竟 iOS 无法访问到内部文件系统去找索引文件。可以试试备份 iPhone 到电脑上后,用 iPhone Backup Extractor 等软件看看能不能导出备忘录数据。
CrazyBob589
2017-12-10 20:10:24 +08:00
@Sylv 哥们儿我把 iPhone Backup Extractor 下载好了,能帮我看一下吗,只要能还原之前的数据,我愿支付宝汇你 500 元!帮帮我吧,如果愿意的话请加我 QQ 615799050,麻烦了!
Sylv
2017-12-10 21:00:44 +08:00
@CrazyBob589 不好意思,我这几天出门在外,手头没电脑,恐怕帮不上忙。你可以先试试下面这个教程看看管不管用:
https://www.iphonebackupextractor.com/blog/recover-and-retrieve-iphone-ipad-ipod-notes/
CrazyBob589
2017-12-10 22:36:32 +08:00
@Sylv 你好,我刚才用 iPhone Backup Extractor 试了一下,似乎 iTunes 备份出来的文件并不包括 Spotlight 额外备份的备忘录,这是不是意味着如果我要查找 Spotlight 的文件就必须要越狱了?
Sylv
2017-12-11 03:30:46 +08:00
@CrazyBob589 我怕即使越狱了也可能找不到上文所说的 notesexternalrecord 索引文件,我搜了下没查到有人在 iOS 上找到此类文件的先例,很有可能 iOS 的 Spotlight 采用的是不一样的索引机制,上文的方法不适用于 iOS。
不过你这种备忘录突然全消失的情况,有可能你的备忘录还保留在 iOS 的 Notes.sqlite 数据库文件里,只是数据库文件的索引损坏了,Notes.sqlite 是个 SQLite 数据库文件,你可以试试用 iPhone Backup Extractor 或越狱的方法把 Notes.sqlite 文件导到电脑上,然后用个 SQLite 客户端软件去读取看看。
还有种方法,你找台 Mac 登你的 iCloud 账号,看看会不会把 Notes 的 Spotlight 索引同步到 Mac 上,然后用上文的方法看看能不能找到 notesexternalrecord 文件来获取备忘录。
CrazyBob589
2017-12-11 12:08:52 +08:00
@Sylv 我刚才用 iPhone Backup Extractor 翻遍了 itunes 备份出来的东西,从 Home\Library\Notes 下翻出来了一个修改日期是 2017 年 10 月 17 日的 notes.sqlite,点进去以后有 4 条还是 5 条 15 年的备忘录记录,其他没了。
还有几个就是 Application Groups\com.apple.notes 下的文件了,NoteStore.sqlite、NoteStore.sqlite.backup 和、NoteStore.sqlite.backup.wal ,NoteStore.sqlite 这个文件我打开后记录的似乎都是一些代码,没有实质内容,NoteStore.sqlite.backup 是个 2.5MB 左右的加密文件,NoteStore.sqlite.backup.wal 是个 0kb 的文件,但是这个 0kb 的文件的修改日期正好能对上我备忘录闪退的时间
其他跟 notes 有关的文件,就只有 notes\Home\Library\Notes 下的 mobilenotes.idx 和 notes.idx ,但修改日期都是 15 年的,估计跟我丢失的备忘录没关系。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/366099

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX