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

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

  •  
  •   Sylv · 46 天前 · 5859 次点击
    这是一个创建于 46 天前的主题,其中的信息可能已经有所发展或是发生改变。

    昨天想要在 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 条附言  ·  45 天前
    更正:

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

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

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


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

    我刚在另外一台旧电脑上试了下也是可行的,所以这个方法应该不是我电脑上的特例。不过两台电脑用的都不是最新的 macOS Sierra 10.12,一台是 OS X El Capitan 10.11.6,另一台是 OS X Yosemite 10.10.5。不知你用的是不是新系统?这个其实可以算是备忘录( Notes )程序的一个漏洞,所以有可能新系统已经将其修复掉了,那这个“找回方法”可能在新系统下已经失效了,可惜手头没有运行 macOS Sierra 的电脑可以亲自确认下。
        13
    ashfinal   45 天前   ♥ 1
    @Sylv 预览就是空白窗体。效果和你 `touch new.txt` 一样的。
    系统是最新的,所以估计这个漏洞已经被修复了。
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1574 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.7.5 · 49ms · UTC 12:43 · PVG 20:43 · LAX 05:43 · JFK 08:43
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1