V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Sylv
V2EX  ›  macOS

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

  •  
  •   Sylv · 2017-06-05 16:30:06 +08:00 · 30754 次点击
    这是一个创建于 2757 天前的主题,其中的信息可能已经有所发展或是发生改变。

    昨天想要在 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 工具将文本内容识别出来,虽然或多或少会有一些识别错误需要手动更正,但至少还是把笔记内容找回来了。

    第 1 条附言  ·  2017-06-06 05:43:38 +08:00
    更正:

    只有备忘录里没被删除的笔记才能在 Finder 或 Spotlight 里用关键词搜索到,笔记被删除掉后就无法搜索到了,不过被删笔记对应的 .notesexternalrecord 文件还是在的,所以要想找回被删笔记,还是得手动一个一个查看 .notesexternalrecord 文件来寻找(可以借助文件创建时间和修改时间来筛选下)。

    这些 .notesexternalrecord 文件似乎就是系统生成来给 Spotlight 搜索备忘录内容用的,在 Spotlight 或 Finder 里搜索出现的备忘录条目的真身就是这些 .notesexternalrecord 文件。
    23 条回复    2018-01-13 23:45:36 +08:00
    Mirage09
        1
    Mirage09  
       2017-06-05 16:49:06 +08:00 via iPhone
    厉害了
    xiubin
        2
    xiubin  
       2017-06-05 17:08:03 +08:00
    厉害了沃德锅
    orzfly
        3
    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
        4
    orzfly  
       2017-06-05 17:21:02 +08:00
    你的文字数据可能是用 UTF-8/UTF-16BE 编码存储的,反正可以都试一下嘛……
    KDF
        5
    KDF  
       2017-06-05 17:22:39 +08:00
    666
    orzfly
        6
    orzfly  
       2017-06-05 17:27:03 +08:00
    不创建压缩包的话可以搜一搜 Resource Fork 是啥,然后会发现一个叫做 xattr 的工具可以读出来……

    $ xattr -p com.apple.ResourceFork a.textClipping | xxd -p -r
    orzfly
        7
    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
        8
    chengfu  
       2017-06-05 17:38:06 +08:00 via iPhone
    难道不是拷贝出来后缀改成 txt !(逃(^-^)
    zyllwy
        9
    zyllwy  
       2017-06-05 17:46:35 +08:00
    厉害了沃德锅
    ashfinal
        10
    ashfinal  
       2017-06-05 18:59:34 +08:00
    0 字节还能预览出内容?
    自己按照楼主方法试了下,并不行。还有谁尝试成功了?
    Sylv
        11
    Sylv  
    OP
       2017-06-06 04:46:05 +08:00
    @orzfly
    按你说的方法试了下,确实解压出了个 __MACOSX 文件夹下的 Resource Fork 文件,不过此文件里并没有包含笔记的内容,里面只是些和内容无关的文件扩展属性值:


    所以笔记的具体内容应该还是保存在备忘录程序的另外一个数据库文件里(稍微查了下,好像是个加密的 SQLite 文件),而这些 .notesexternalrecord 文件只是单纯的某种索引文件,用来定位备忘录里的具体笔记。
    Sylv
        12
    Sylv  
    OP
       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
        13
    ashfinal  
       2017-06-06 11:52:17 +08:00   ❤️ 1
    @Sylv 预览就是空白窗体。效果和你 `touch new.txt` 一样的。
    系统是最新的,所以估计这个漏洞已经被修复了。
    CrazyBob589
        14
    CrazyBob589  
       2017-12-10 14:54:15 +08:00 via iPhone
    @Sylv 抱歉隔了那么久回帖,我想问一下,如果 iPhone 也遇到了同样的情况,有办法找回吗?我昨天 iPhone 备忘录抽风闪退,里边保存的几百条备忘录全没了,iCloud 和邮箱里也没备份,但是 Spotlight 里全都能通过关键字搜到相应的被抽掉的备忘录
    Sylv
        15
    Sylv  
    OP
       2017-12-10 15:25:28 +08:00 via iPhone
    @CrazyBob589 如果没有同步到 Mac 上的话,估计很难找回了,毕竟 iOS 无法访问到内部文件系统去找索引文件。可以试试备份 iPhone 到电脑上后,用 iPhone Backup Extractor 等软件看看能不能导出备忘录数据。
    CrazyBob589
        16
    CrazyBob589  
       2017-12-10 20:10:24 +08:00
    @Sylv 哥们儿我把 iPhone Backup Extractor 下载好了,能帮我看一下吗,只要能还原之前的数据,我愿支付宝汇你 500 元!帮帮我吧,如果愿意的话请加我 QQ 615799050,麻烦了!
    Sylv
        17
    Sylv  
    OP
       2017-12-10 21:00:44 +08:00 via iPhone
    @CrazyBob589 不好意思,我这几天出门在外,手头没电脑,恐怕帮不上忙。你可以先试试下面这个教程看看管不管用:
    https://www.iphonebackupextractor.com/blog/recover-and-retrieve-iphone-ipad-ipod-notes/
    CrazyBob589
        18
    CrazyBob589  
       2017-12-10 22:36:32 +08:00
    @Sylv 你好,我刚才用 iPhone Backup Extractor 试了一下,似乎 iTunes 备份出来的文件并不包括 Spotlight 额外备份的备忘录,这是不是意味着如果我要查找 Spotlight 的文件就必须要越狱了?
    Sylv
        19
    Sylv  
    OP
       2017-12-11 03:30:46 +08:00 via iPhone
    @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
        20
    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 年的,估计跟我丢失的备忘录没关系。。。
    sandclass
        21
    sandclass  
       2018-01-13 17:56:37 +08:00
    楼主你好!按照你的方法尝试了一下,最开始很成功,打开了三四个以前删除掉的备忘录文件。但是从第五个开始,可能是文件太大了的关系,快速预览一直显示不出来,是一个圈在转的画面。于是我关掉了窗口,打算再试试下一个文件,结果打开也是这种状况,并且备忘录不停地跳动,而且没办法关闭,关闭的时候会显示“现在关闭无法储存之前的所有更改”,我实在没办法最后点了仍然退出,强制关掉了。结果等再打开备忘录就什么都没了,不仅我之前想找的文件没找到,而且原有的所有文件全部消失了,我翻遍了最近删除、回收站、icloud 都没有找到。于是我再次打开 了_records 目录下的文件,结果发现这次按空格键快速预览不再出现内容了,而是一个放大的文件图标,旁边有创建名,文件日期什么的。尝试着用备忘录或文本编辑器等其他程序打开,也都是空白文档。想请教这种情况还有救吗?特意为此注册加入了这个社区,希望您能看到可以帮帮我吧,谢谢!
    Sylv
        22
    Sylv  
    OP
       2018-01-13 20:21:44 +08:00 via iPhone
    @sandclass 你好,你这种情况大概是强退导致备忘录数据库损毁了,很不好意思,我也不知道这种情况该怎么办,超出我能力了,抱歉帮不上忙。建议你可以尝试联系下苹果的技术支持,看看他们能不能恢复损坏的数据,或者你要是有 Time Machine 备份可能能恢复回来。
    sandclass
        23
    sandclass  
       2018-01-13 23:45:36 +08:00
    @Sylv 然而我并没有备份,可能这就是天意要让我记住及时备份的重要性吧。不过还是谢谢您啦!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5757 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:32 · PVG 14:32 · LAX 22:32 · JFK 01:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.