虽然它有潜力,但并不适合所有人。 主要限制包括价格高昂(每月 20 美元)、需要更新的硬件(仅支持 M 系列处理器型号)、尚不支持中文以及潜在的隐私问题。 等待。
因此,在试用期间,我也产生了一个想法:我可以自己复制吗? 录制的是视频,我认为这有点不必要,也不方便处理。 最好简化为“如何以更高的频率定期截图”,这样仍然可以满足备忘录的需求,并且生成的格式更加通用。
但听起来还是很复杂。 我们不妨将其分解为以下几个具体问题,然后一一解决:
下面,我先提供一下我做出的解决方案,然后详细讲解一下制作流程和相关原理。 即使您不需要定期截取屏幕截图,了解本文中介绍的技术也将有利于 macOS 中的高级自动化。
快速使用 shell 脚本,然后: 将其放在任意固定目录中。 按照Unix惯例,这种自制脚本一般可以放在~/bin目录下; 在终端执行chmod +x ~/bin/命令为其添加执行权限; xyz.cyhsu...plist,然后:放在 ~ /// 目录下。 你可以按-Shift-G然后粘贴上面的路径直接到达这个隐藏目录; (重要)使用或其他文本编辑器打开此plist文件,并将第9行的内容更改为您存储上述脚本的实际路径。 注意,如果路径中涉及~,需要扩展为完整的/Users/[],其中[]是你的用户名; 使用brew安装文本识别,并下载简体中文OCR识别所需的数据集,然后根据您的Mac处理器类型将其放置在以下目录中,其中[]指的是实际安装的版本号:单击Apple菜单>“在“系统设置”中,在“隐私和安全”中选择“屏幕录制”,然后单击加号形状的“添加”按钮,并确保以下各项均已添加到列表中(仍然可以通过按来跳转文件选择窗口) -Shift-G 快捷键然后粘贴路径):在终端中执行 load ~///xyz.cyhsu ...plist。
这样就可以在~//目录下看到带时间戳的PDF格式截图,每半分钟一次。 如果连接了外部显示器,将单独捕获每个屏幕。
根据机器性能和屏幕截图大小,每个屏幕截图将在创建后大约一两分钟内被压缩并识别文本。 之后就可以通过你习惯的工具来搜索文本内容了。
这个自动化过程将在后台继续运行,并在启动时自动启动。 如果需要停止,可以在终端中执行~///xyz.cyhsu...plist来卸载。 如果不再需要此功能,只需删除上述步骤中下载的两个文件即可。
原理与讨论
为了方便阅读,以下是脚本内容:
#!/bin/bash
outpath="$HOME/Pictures/Rewind"
mkdir -p "$outpath"
nDisplay=$(system_profiler SPDisplaysDataType | grep -c Resolution)
ts=$(date +%Y%m%d%H%M%S)
# Detect whether ocrmypdf is installed
if ! command -v ocrmypdf &>/dev/null; then
echo "ocrmypdf could not be found"
exit
else
omp=$(command -v ocrmypdf)
fi
# Capture screenshots
echo "Capturing at $ts"
capture=$(
for ((i = 1; i <= nDisplay; i++)); do
echo "$outpath/capture.$ts.$i.pdf"
done
)
echo "$capture" | xargs screencapture -x -t pdf 2>&1 && echo "Captured"
# OCR output files
for ((i = 1; i <= nDisplay; i++)); do
taskpolicy -b\
"$omp" "$outpath/capture.$ts.$i.pdf" "$outpath/capture.$ts.$i.pdf" \
-l chi_sim+eng\
--output-type pdf\
--optimize 3
done
在后台创建屏幕截图:使用
这是最简单的步骤:macOS 附带了一个用于截屏的命令。 它的基本用法是FILE,其中FILE是输出截图文件的名称。
另外,可以使用-x选项禁用截图声音,并使用-t [jpg|png|pdf|tiff]选项指定输出格式。 (更多选项和用法,请参阅手册页 man。请不要错过 Apple 工程师对编写糟糕的文档的抱怨 - 快二十年过去了,还没有人回应)。
在这里,我们选择将屏幕截图保存为PDF格式。 主要原因是PDF可以直接将接下来识别的文本内容以文本叠加的形式保存在文件中,用途非常广泛,也易于检索; 而PNG格式只能写在注释中。 在其他地方,第三方工具支持有限,并且很容易在跨系统传输中丢失。
PDF可以将下一个识别的文本内容以文本叠加的形式直接保存在文件内部。
另一个需要考虑的细节是外部显示器的场景。 支持多个监视器,但笨拙的语法需要在参数中写入每个监视器的屏幕截图的文件名。 为此:
我们首先获取当前的显示信息,使用grep统计提到“”()的次数,然后我们就知道总共有多少个屏幕(第5行); 然后检索消除截图,我们使用 for 循环构建一个带有显示序列号和时间戳的多个文件名(使用日期实现,第 6 行),可以使用 xargs(第 23 行)将其馈送到一起。
另一个烦人的事情是,随着 macOS 加紧权限管理,屏幕录制也成为重点目标。 如果不进行设置,通过后台脚本静默执行的截图操作只能截取一个空桌面。
为此,我们需要在“系统设置”>“隐私与安全”>“屏幕录制”中将脚本中涉及截图操作的所有程序添加到白名单中。
在这里,我们的脚本:
因此,需要将上述三项对应的可执行文件添加到白名单中才能正常截图。 这就是为什么需要开头提到的步骤 4 的原因。
识别文本并压缩截图大小:使用
过去曾发表过一篇关于如何从扫描的 PDF 中检索文本的文章。 本文遵循该文章中描述的用法。 唯一常用的选项是 -- 3; 据此,这是指对图像进行相对激进的有损压缩,特别适合“只要看得清楚”的场景,例如截图并保存为文件。 。
实际空间使用情况是多少? 我的工作环境是 16 英寸 Pro 搭配 4K 分辨率显示器。 压缩后,内置和外接显示器的屏幕截图的PDF大小一般在200KB和400KB以内,总大小一般不超过600KB。 即使经过压缩,截图质量也非常好。 除了部分颜色较多的图片出现色阶外,完全不影响观看。
如果每天使用10小时,每半分钟截图一次,这相当于每天约700MB,每月约21GB,与广告宣传的14-39GB类似。 考虑到现在的Mac起步至少256GB检索消除截图,只要定期清理,我认为这个使用量是可以接受的。
让任务定时执行并开机自动启动:使用
这是本文解决方案中的一个关键环节,也是我推荐读者了解是否需要本文的一个技巧。
说到定时执行任务,有一定Linux基础的读者可能会想到经典的cron。 macOS 确实保留了 cron,但它也有一个更原生的“升级版”,那就是。 正如苹果手册页所说,macOS 充分吸收了 cron 的功能,并且更加灵活。
那么是谁呢? 作为一个init程序,它对于macOS来说有着重要的意义。 它是系统启动后加载的第一个进程。 它负责初始化系统并启动各种进程和服务。 可以说扮演着“旗手”和“总指挥”的角色。 当然,启动和计划任务也是功能的一部分。
该行为是通过称为“属性列表”(plist) 的 XML 格式的配置文件指定的。 这个配置文件安装到系统指定的几个位置后就变成了or。 就本文而言,您所需要做的就是制作一个文件并将其安装在~//下,这意味着为当前登录的用户启动和控制特定操作。
这是我们在开始步骤中提供的 plist 文件。 下面,我们简单介绍一下它的结构和功能。
Label
xyz.cyhsu.script.rewind
ProgramArguments
/Users/platyhsu/bin/rewind
EnvironmentVariables
PATH
/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
StartInterval
30
RunAtLoad
StandardOutPath
/tmp/rewind.log
如果你想让别人按时为你完成一项任务,你显然需要解释清楚要做什么、什么时候做以及如何做。 内容大致就是回答这些问题。
具体来说,这个XML文件包含一个字典,它下面的键描述了要执行的任务(作业)的各种属性。 更关键的属性包括:
标签 任务的标签仅用于识别和区分的目的。 理论上可以随便填写,但约定是使用反向DNS命名。 如果您有自己的域名,您可能需要将其倒置在标签的开头,就像我在示例文件中所做的那样。
核心配置项是指要执行的命令。 请注意,这是一个数组类型。 数组中的每个字符串对应一个参数,要运行的命令是第一个参数。
例如,如果要运行 ls -a /etc 命令,请注意它被空格分为三部分:命令名、选项和路径参数,因此应将其拆分为三个元素并编写:
ProgramArguments
ls
-a
/etc
这里,我们要执行的是一个现成的脚本文件~/bin/,所以只需用一个字符串来存储它的路径即可。 正如一开始提到的,需要注意的是,这里不支持变量,也不支持~之类的缩写。 只能填写绝对路径。(按住该键并右键单击目录可以看到复制路径的选项。)
指运行程序的环境变量。 加载器的环境和我们通过终端工具访问的命令行环境不同。 就本文而言,这种差异的主要影响是它的默认搜索路径(即PATH变量的值)不包括软件安装的目录,因此无法直接运行诸如此类的工具。 这需要通过按键进行调整。
它也是一个单词的典型键,其下的每个键值对用于分配一个变量。 这里,我们将安装路径 /opt//bin (M 系列处理器版本)和 /usr/local/bin (Intel 处理器版本)添加到 PATH 变量的开头(第 11-15 行)。
指运行任务之间的时间间隔,单位为秒。 我这里填的是30秒,对于召回和打捞操作记录来说,这个粒度应该足够细了。 当然,您可以根据自己的喜好随意调整。
一个布尔值,如果为 true,则任务在加载后立即开始运行。 否则,任务将等待直到满足运行条件(在本例中,自加载以来已经过了一段时间)才开始运行。
指运行任务得到的命令行输出()保存在哪里,非常适合记录日志。 这里,我指定 /tmp/.log 作为日志路径,并在脚本中传递 2>&1(第 23 行),以将可能遇到的任何错误消息重定向到标准输出。 这个路径没有什么特别的,但是/tmp的好处是重启后会自动清除,无需手动清除日志。
如果不需要日志,也可以删除该键。
完成文件后,将其放在~//目录下即可完成安装。 如果您使用的是 macOS 或更高版本,您还会看到一个弹出通知,告诉您已添加新的后台项目(尽管措辞非常混乱)。
最后,正如开头提到的,我们需要通过控制程序来加载这个,即在终端中执行load ~///xyz.cyhsu...plist。
就本文而言,了解上述级别就足够了。 如果您想了解更多使用方法,可以参考以下资源:
节省处理器资源:使用
突出的特点之一是针对苹果进行了优化,占用系统资源更少。 毕竟,没有人愿意因为备份功能而干扰自己的日常工作。 我们如何在我们的山寨版本中模拟这一点?
您可能知道,macOS 与其他基于 Unix 的系统一样,支持通过nice 命令设置进程优先级。 Nice 值是 -20 到 19 之间的整数。0 是默认值。 值越大,优先级越低(因为流程越好,越“文明礼貌”)。 查看手册,确实有一个叫Nice的选项,是用来设置优先级的。
然而,在经过苹果高度修改的当代 macOS 上,nice 的实际意义很小。 (见解释)尤其是在采用大小核架构的Apple上,不可能通过设置较高的nice值来绑定进程运行在节能小核上。
因此,我们需要一个更适合当代 macOS 的工具。 查阅手册(man)表明,在命令之前添加 -b 可以让进程以所谓的“后台”优先级运行。 对于苹果来说,这是确保进程在小内核上运行的少数方法之一。 (研究仍然建议阅读。)这就是脚本第 27 行的来源。
那么,强制使用小核对脚本执行效率有多大影响呢? 在我配置为M1 Max的Pro上,如果不进行任何设置,处理内部和外部屏幕的截图大约需要20秒; 强制使用小核心后,这个过程延长到100秒左右。 考虑到我们很少需要立即“回忆”刚刚捕获的屏幕截图,所以延迟两分钟是可以接受的。
扩展应用程序通过命令行更快地找到屏幕截图
第一步演示了使用系统内置搜索查找屏幕截图内容的效果。 但如果您习惯使用命令行,我建议将 -all 与 fzf 结合使用来快速(快得快)检索 PDF 文件。 具体方法可以看一下。
批量删除某段时间之前的截图
虽然我们的脚本通过压缩截图并在截图文件名中添加时间戳来控制大小以便于检索,但定期清理未使用的截图也是有必要的。 为此,我们可以使用find命令的-选项来查找在特定时间段之间或之前和之后创建的文件,然后使用-选项来批量删除它们。
请参阅以下示例。 语法可以说是白话,一看就明白意思:
# 列出并删除一个月之前创建的截图
find ~/Pictures/Rewind -not -newerct "1 month ago" -delete
# 列出最近 10 小时创建的截图
find ~/Pictures/Rewind -newerct "10 hours ago"
您可以根据自己的喜好预先编写一些常用的清理命令,然后使用快捷命令、快捷方式等工具将其打包成一键快捷方式。