1. 右键菜单翻遍了也没有"新建文件",这功能到底缺在哪
第一次从别的系统换到 Mac 的人,十有八九会在桌面空白处右键点一下,然后愣住:菜单里只有"新建文件夹"、显示简介、更改背景,唯独没有"新建文本文档"。想建个 txt 记点东西,或者临时拉一个 Word、Excel 出来,要么先去开对应软件再另存为,要么从别处复制一个旧文件改名字。这个小动作每天重复十几次,累计起来是真烦。
我做桌面效率相关的内容有几年了,被问得最多的问题之一就是"Mac 右键新建文件怎么弄"。所以这篇就把这件事彻底讲透:不是教你装一个软件了事,而是把系统自带的"自动操作"、系统的"快捷指令"、终端命令、以及第三方扩展四条路径全部拆开,让你按自己的使用习惯挑一条,或者干脆组合起来用。读完你应该能做到:在访达任意目录右键,直接生成一个空白的 txt、md、docx、xlsx、pptx,甚至是 .py、.js、.html 这类代码文件,而且新文件生成后光标直接落在文件名上,敲字就能改名。
先说清楚"为什么没有"这件事,因为它决定了你后面选哪条路。
访达的右键菜单本质上是上下文菜单——它针对的是"你当前选中的对象"。你选中一个文件,它给你压缩、拷贝、制作替身;你选中一个文件夹,它给你改标签、加入边栏。可当你在空白处右键时,上下文里没有任何对象,系统只能提供"针对当前这个容器"的操作,也就是新建文件夹、排序方式、查看选项这些。新建一个"具体类型的文件"在系统看来不属于容器级操作,它属于"某个应用创建了自己的文档",所以这件事被交给了应用本身去负责。
这个设计逻辑不算错,但它默认了一个前提:你总是先打开应用,再在里面新建文档。而实际工作流里,大量场景是反过来的——我先有一个目录结构,想在里面丢几个占位文件,然后再决定用哪个软件打开。这两种思路的差异,就是"习惯"和"别扭"之间的全部距离。
好在系统并没有把门关死。它留了三个口子:自动操作(Automator)可以把你写的脚本包装成一个"快速操作",挂到右键菜单里;快捷指令应用在较新的系统版本里也能挂进访达;终端则是绕过图形界面直接从命令行创建。再加上第三方扩展工具这条路,一共四种选择。它们的差别不在于"能不能做到",而在于配置成本、稳定性和后期维护的麻烦程度。
| 方案 | 配置成本 | 支持格式 | 稳定性 | 适合谁 |
|---|---|---|---|---|
| 自动操作(快速操作) | 中等,一次性配置十几分钟 | 任意,靠脚本控制 | 高,系统自带,升级一般不失效 | 愿意折腾一次、长期用的人 |
| 快捷指令 | 低到中等 | 任意,但逻辑表达不如脚本灵活 | 中高,随系统版本有变化 | 系统版本较新、已经在用快捷指令的人 |
| 终端命令 | 极低 | 任意 | 最高 | 手不离键盘的人 |
| 第三方扩展 | 低,下载即用 | 看工具支持范围 | 中,受权限和系统升级影响 | 完全不想碰脚本的人 |
下面按"配置成本从高到低、但长期收益从高到低"的顺序讲,你可以只看自己需要的那一节。
2. 用系统自带的自动操作,做一个全格式新建器
这条路是我最推荐的,原因很实在:自动操作是系统自带组件,不需要装任何东西,不联网,不涉及第三方权限,配置一次能用很多年。系统大版本升级后偶尔需要重新勾选一下,但工作流本身不会丢。
2.1 工作流的输入输出必须先定对,否则后面全白搭
打开"自动操作",新建文稿时选**"快速操作"**(老版本里叫"服务")。这一步选错,后面怎么弄都不会出现在右键菜单里,这是新手最常见的第一个坑。
新建之后看窗口顶部那一行设置,有三个下拉框,必须这么设:
- "工作流程收到当前"选"文件或文件夹"
- "位于"选"访达"
- "图像"随便选一个,或者留空,它只影响菜单里显示的小图标
这三个选项决定了这个工作流会被注册到哪个应用的菜单里。选成"文本"或者"网址",它就不会出现在访达右键里。
接下来是核心:从左侧动作库搜索"运行 Shell 脚本",拖到右边的工作区。在这个动作的面板里,有一个关键选项叫"传递输入",必须改成"作为参数"。默认值可能是"到 stdin",如果保持默认,你的脚本收到的不是文件路径,而是一段标准输入流,脚本里的$@会是空的,于是它什么也不做——表现就是"右键点了没反应",非常容易误判成脚本写错了。
顺便把"Shell"选成/bin/bash或/bin/zsh都行,看你习惯。我一般用 bash,因为语法兼容性最稳。
2.2 一段脚本吃下所有格式:靠扩展名分流
真正干活的部分在这里。最朴素的版本是这样的:
#!/bin/bash EXT="txt" # 想换成 md、py、html 就改这里 TARGET="" for f in "$@"; do if [ -d "$f" ]; then TARGET="$f" break fi done if [ -z "$TARGET" ]; then TARGET=$(osascript -e 'tell application "Finder" to POSIX path of (target of front window as alias)') fi [ -z "$TARGET" ] && exit 1 cd "$TARGET" || exit 1 BASE="未命名" NEW="${BASE}.${EXT}" i=2 while [ -e "$NEW" ]; do NEW="${BASE} ${i}.${EXT}" i=$((i+1)) done touch "$NEW"这段逻辑里有几个细节值得说一下,都是实际踩出来的:
第一,为什么要判断-d。快速操作收到的参数可能是你选中的文件,也可能是你选中的文件夹,还可能是空的。只有当参数是目录时,我们才知道"应该建在哪个目录里"。如果直接拿第一个参数当目录用,而你恰好选中了一个文件,脚本就会在一个文件路径上cd,直接失败。
第二,为什么要有 osascript 那段兜底。这是最容易被忽略的场景:你在访达窗口的空白处右键,此时没有任何选中项,$@是空的。很多教程只考虑"选中文件夹再右键"的情况,结果用户按教程做完,在空白处右键发现没反应,就以为是坏的。兜底逻辑通过 AppleScript 拿到最前面那个访达窗口当前所在的目录,这样两种右键方式都能工作。
第三,为什么要有重名递增。touch一个已存在的文件不会报错,它只会更新时间戳——这意味着如果你连点两次,第二次看起来"什么都没发生"。加一个while [ -e ]循环,第一次生成"未命名.txt",第二次生成"未命名 2.txt",行为可预期。
想支持多种格式怎么办?两种做法。做法一是复制多份快速操作,每份改一个 EXT,分别命名为"新建 txt""新建 md""新建 py"。好处是每个都有独立的菜单项,点一下就行;坏处是菜单会变长。
做法二是写一个带弹出选择的版本,用 AppleScript 的choose from list让用户选格式:
CHOSEN=$(osascript -e 'choose from list {"txt","md","py","html","json"} with prompt "选个格式" default items {"txt"}') [ "$CHOSEN" = "false" ] && exit 0然后把$CHOSEN当扩展名用。这个方案菜单干净,但每次多点一次选择框。我个人用下来,高频格式做成独立菜单项(txt、md、docx、xlsx 四个),低频格式用一个"更多格式"入口,是手感最平衡的分法。
2.3 模板法:让新建的 Word、Excel 自带你想要的样式
touch只能生成 0 字节的空文件。对 txt 来说这没问题,但对 docx、xlsx 来说不行——Office 的文档是压缩包结构,0 字节文件双击打不开,会提示文件损坏。
正确做法是模板复制:先准备一个"空白但有内容"的模板文件,脚本把它复制到目标目录再改名。
第一步,建一个存放模板的隐藏目录:
mkdir -p "$HOME/Library/Application Support/MyNewFile"第二步,往里面放模板文件。命名用英文,避免路径里出现空格和中文带来的转义麻烦:
blank.docx blank.xlsx blank.pptx blank.pages blank.numbers模板从哪来?如果你装了办公套件,直接新建一个空白文档,把字体、字号、行距、页边距调成你常用的样子,另存为模板格式或者直接当普通文档存进去。如果不装办公套件,用系统自带的文稿应用建一个空白文稿,导出成 docx 或 xlsx 格式也可以,导出的文件作为模板完全够用。
模板法的价值不只是"能打开",更在于它把你每次都要重复做的排版动作固化下来了。比如我写周报用的 docx 模板里已经设好了标题样式、页边距和页码;记账用的 xlsx 模板里已经放好了表头和公式。右键一点,出来的就是能直接写东西的文档,省掉的是"新建→改字号→插表格"这一整套。
第三步,把脚本里的touch "$NEW"换成按扩展名映射的复制逻辑:
TPL_DIR="$HOME/Library/Application Support/MyNewFile" case "$EXT" in docx) TPL="$TPL_DIR/blank.docx" ;; xlsx) TPL="$TPL_DIR/blank.xlsx" ;; pptx) TPL="$TPL_DIR/blank.pptx" ;; *) TPL="" ;; esac if [ -n "$TPL" ] && [ -f "$TPL" ]; then cp "$TPL" "$NEW" else touch "$NEW" ficp的时候注意目标文件名要带上正确扩展名,否则系统认不出类型,双击会用错误的程序打开。
2.4 挂上右键之后"看不见",八成是这几处没弄对
保存工作流,命名成"新建文本文件"这种一看就懂的名字。然后去访达右键看一眼,正常情况下它会在**"快速操作"子菜单**里,而不是直接在菜单第一层。
如果你找不到,按这个顺序排查:
第一,检查系统设置里的扩展是否勾选。不同系统版本路径略有差异,大致在"系统设置 → 通用 → 登录项与扩展 → 访达"或者"系统设置 → 隐私与安全性 → 扩展"里,找到访达相关的扩展列表,确认你的快速操作被勾上了。新保存的工作流有时需要手动勾选一次才会出现。
第二,检查自动化权限。第一次运行涉及 AppleScript 控制访达的工作流时,系统会弹窗问"是否允许",如果当时手快点了拒绝,之后就一直静默失败。去"系统设置 → 隐私与安全性 → 自动化"里找对应条目,重新打开。
第三,看是不是被"快速操作"折叠了。菜单位置靠下的项目会被收进子菜单,这不是故障。
第四,如果脚本涉及控制其他应用(比如自动触发重命名),还需要"辅助功能"权限。这一条在下一节会详细说。
还有一个隐蔽的问题:如果你把工作流建在了 iCloud 云盘的"自动操作"目录里,多台设备之间可能不同步或者重复注册。建议就放在本机的默认位置,别乱挪。
3. 新建完还要手动改名?把这一步也省掉
这是很多人做完自动操作之后的下一个痛点:文件是建出来了,但名字叫"未命名.txt",你还得再点一下、再敲字、再回车,三次操作。既然都写脚本了,不如把"进入重命名状态"也一起做了。
3.1 用 AppleScript 选中文件并触发重命名
思路很直接:脚本创建完文件后,让访达选中它并激活窗口,然后模拟按一下回车键——访达里选中文件按回车就是进入重命名。
on run argv set thePath to item 1 of argv tell application "Finder" set theFile to POSIX file thePath as alias reveal theFile select theFile activate end tell delay 0.3 tell application "System Events" key code 36 end tell end runkey code 36就是回车键。delay 0.3不能省,因为访达响应选中状态需要时间,太快的按键会丢失。这个延迟在慢一点的机器上可能要加到 0.5 秒,你可以按自己的机器实测调整。
把它接到 Shell 脚本后面:要么在工作流里再加一个"运行 AppleScript"动作,把上一步输出的路径作为参数传下去;要么直接在 Shell 脚本末尾调用osascript执行一段内联脚本。
权限提醒:System Events模拟按键属于"辅助功能"范畴,第一次跑会弹窗要求授权,去"系统设置 → 隐私与安全性 → 辅助功能"里把"自动操作"或者"访达"勾上。这一条如果漏了,表现是文件建出来了,但光标没落到文件名上,什么提示都没有。
3.2 一个更省事的分支:干脆不让它问名字
还有另一种思路,我觉得对某些场景更好用:不问名字,直接用时间戳或者当前目录名当文件名。
STAMP=$(date +%Y%m%d-%H%M%S) NEW="笔记-${STAMP}.md"适合什么场景?随手记录、截图旁注、临时草稿。这类文件你本来也不太会认真起名,用时间戳反而好检索。而对正式文档,你肯定要起个有意义的名字,那就保留重命名流程。
我自己的配置是:txt 和 md 走"建完直接进重命名",docx 和 xlsx 走"时间戳自动命名"。因为前者多是随手记,需要立刻打字;后者多是正式文档,反正要打开软件写,进去再改标题也不迟。
3.3 模板里的隐藏坑:编码和换行
这一条很少有人说,但确实会绊人。
用touch建出来的 txt 是 0 字节、无编码状态。你用系统自带的文本编辑打开它,输入中文,保存,没问题。但如果你后续用某些命令行工具处理,或者要上传到某个只认 UTF-8 的系统,可能会遇到乱码。
更麻烦的是文本编辑这个应用默认新建的其实是富文本格式。如果你从它里面"新建文稿"再另存为 txt,可能会出现编码提示。用模板法建 txt 时,最稳的做法是用命令行写一个明确的 UTF-8 空文件:
printf '' > "$NEW"或者干脆塞一行占位内容,保证编码是 UTF-8:
printf '\n' > "$NEW"区别在于:printf ''生成 0 字节,printf '\n'生成 1 字节(一个换行符)。有些老旧的检查工具会把 0 字节文件判定为"空文件"并拒绝上传,遇到这种场景,用带换行符的版本更保险。
4. 快捷指令这条路,什么情况下比自动操作顺手
系统版本比较新的机器上,快捷指令应用已经深度接进了访达。如果你已经在用快捷指令做别的事情(比如一键整理下载目录、一键切换专注模式),那把新建文件也放进去,管理起来会更集中——所有自动化都在一个列表里,不用在两个应用之间来回找。
4.1 挂进访达菜单的两个开关
新建一个快捷指令,在右侧的详情面板里有两个必须打开的开关:
- "在访达中使用"(有的版本叫"在访达中显示")
- "用作快速操作"
只开第一个不开第二个,它只会出现在访达工具栏或者服务菜单里,右键菜单里看不到。两个都开,右键的"快速操作"子菜单里才会出现。
接收的输入类型要设成**"文件或文件夹"**,如果设成"文本",访达里右键时它会被过滤掉。
内容部分,加一个"运行 Shell 脚本"动作,脚本内容和第 2.2 节基本一致,区别是快捷指令传参的方式略有不同,需要在脚本动作里指定"将输入作为参数传递"。
4.2 快捷指令的优势和它做不到的事
优势很明确:配置界面是可视化的,动作拖来拖去就行,不需要记 Automator 那一套"收到当前""传递输入"的术语。而且它能在多台设备之间同步(如果你开了同步),换电脑不用重配。
局限也得说清楚:
一是逻辑表达能力不如纯脚本。稍微复杂一点的判断(比如"如果这个目录是只读的就弹窗提示"),在快捷指令里用动作块拼起来会非常啰嗦,而脚本里就是一个if。所以我的建议是:外壳用快捷指令,重活交给 Shell 脚本,中间用"运行 Shell 脚本"动作衔接。这样两边的好处都拿到。
二是版本差异比较明显。不同系统版本里,快捷指令在访达里的入口位置、开关名称、甚至是否支持"快速操作"都有差别。你在网上看到一篇教程照着做没找到对应选项,很可能只是版本对不上,不是你做错了。
三是同步有时会有延迟。新建的快捷指令在另一台机器上可能要过一会儿才出现,急着用的时候会抓瞎。
5. 完全不想碰脚本:第三方右键增强工具的取舍
如果你看到代码就头大,那第三方工具是唯一省事的选择。这类工具的形态都差不多:装完之后在访达右键里加一个菜单,里面预置了几十种文件类型,点一下就生成。有的还支持自定义模板、自定义菜单层级。
装之前有几件事必须先想明白,否则装完发现不工作,会浪费很多时间。
5.1 权限是这类工具的第一道门槛
这类工具的核心原理是往访达里注入一个扩展(Finder Extension)。系统对这类扩展管得很严,装完之后默认是不启用的,需要你手动去系统设置里勾选。路径大致在"系统设置 → 通用 → 登录项与扩展 → 访达扩展",或者在"隐私与安全性 → 扩展"里找。找不到这个开关,工具就永远不出现在右键菜单里。
第二道门槛是磁盘访问权限。要在"文稿""桌面""下载"这些受保护目录里创建文件,扩展需要相应的授权。第一次在桌面右键失败、在用户目录右键成功,基本就是这个原因。
第三道是自动化权限。如果这个工具想在创建后自动帮你选中文件(也就是前面说的"直接进入重命名"),它需要辅助功能权限。不给也能用,只是少了这一步便利。
我把这三条按顺序写出来,是因为它们出问题的概率依次递减,但排查难度依次递增。扩展没勾选是最常见的,看一眼就能解决;磁盘权限的问题表现是"某些目录不行某些目录行",容易误判成 bug;自动化权限的问题最隐蔽,因为功能"基本能用",只是少了点顺滑。
5.2 菜单膨胀之后怎么收拾
这类工具的通病是默认把所有格式都塞进菜单。刚装上的时候觉得什么都有很爽,用一个月之后你会发现右键菜单长得要滚屏,真正常用的那三五个被淹没在中间。
我的处理原则是:只保留实际用到的格式,其余全部关掉。一般工具的设置里都能勾选"显示哪些类型",把图片格式、音频格式、压缩包这些你根本不会右键新建的类型去掉。菜单从二十项砍到五项,点击效率的提升比想象中大。
另外一点:不要同时装两个同类工具。它们会各加一个菜单项,而且可能互相抢同一个扩展入口,导致其中一个失效。如果要换工具,先把旧的卸载干净再装新的。
6. 那些"右键点了没反应"的具体原因,一条条对着查
前面讲的都是正常路径。但实际操作中,失败的情况比成功多。这一节把我在自己机器和别人机器上遇到过的故障整理成一个排查链路,你按顺序走,基本能定位到问题。
6.1 从外到内:先确认触发层,再确认脚本层
第一步,确认菜单项到底有没有出现。右键 → 看"快速操作"子菜单里有没有你命名的那个条目。有,说明注册成功,问题在脚本;没有,说明注册就没成功,别去改脚本,先回头检查保存时选的是不是"快速操作"、系统设置里的扩展有没有勾选。
这个判断能省掉一大半无效折腾。很多人一出问题就去改脚本,改了半天发现根本没被调用过。
第二步,把脚本单独拎出来在终端跑。打开终端,cd到目标目录,把脚本内容粘进去执行。如果终端里能正常生成文件,说明脚本逻辑没问题,问题在参数传递或者权限;如果终端里也失败,那就是脚本本身有错,看报错信息改。
这一步的关键是排除变量。快速操作这条链路里有两层:触发层(访达调用工作流)和执行层(工作流跑脚本)。分开测,才能知道是哪一层坏了。
第三步,检查参数是不是空的。在脚本最前面加一行调试输出:
echo "参数个数: $# | 参数内容: $@" >> /tmp/newfile_debug.log然后在不同场景下各点一次右键(选中文件夹、空白处右键、选中文件),看日志里记了什么。这一步能直接暴露"空白处右键收不到参数"这类问题。
第四步,检查路径里的特殊字符。目录名里有空格、中文、括号、&符号,如果脚本里变量没加引号,路径会被拆成好几段。养成习惯:所有变量引用都写成"$VAR",不要写$VAR。这一条能避免九成的诡异失败。
6.2 三类典型故障的对照表
| 现象 | 最可能的原因 | 处理方式 |
|---|---|---|
| 右键菜单里完全找不到条目 | 工作流类型选错,或扩展未勾选 | 重新确认保存类型为"快速操作";去系统设置勾选访达扩展 |
| 菜单里有,点了没反应 | 脚本报错退出,或"传递输入"设成了 stdin | 加调试日志;把传递输入改为"作为参数" |
| 部分目录能建,部分目录不行 | 受保护目录的磁盘访问权限 | 在隐私设置里给对应组件授权 |
| 文件建出来了但打不开 | 0 字节文件冒充 Office 格式 | 改用模板复制方案 |
| 建出来后没进重命名状态 | 缺少辅助功能权限 | 授权后重试,或把延迟调大到 0.5 秒 |
| 系统升级后突然失效 | 扩展注册被重置 | 重新勾选扩展,或重启访达 |
最后一行值得单独说。系统大版本升级之后,扩展的勾选状态有可能被重置。我遇到过一次,升级完发现所有快速操作都消失了,检查了半天脚本,最后发现就是设置里那个勾没了。重新勾上,一秒解决。所以以后再遇到"昨天还好好的今天不行了",先看权限和扩展,别急着怀疑代码。
6.3 一个万能的重置动作
如果实在查不出来,可以试一下重启访达。终端里执行:
killall Finder访达会自动重启,桌面图标闪一下。这个动作会清掉访达的服务菜单缓存,很多"菜单项不刷新"的问题都能靠它解决。副作用是所有访达窗口会关掉,正在拖拽的文件操作会中断,所以别在拷贝大文件的时候用。
如果重启访达还不行,注销当前用户再登录一次。这会清掉更上层的缓存,代价是打开的应用都要重开。我把这招留到最后,因为它耗时,但确实有效。
7. 我最终留在机器上的那套配置
折腾了这么多方案,最后我稳定在的组合是这样的:自动操作做了五个快速操作——新建 txt、新建 md、新建 docx、新建 xlsx、新建代码文件(这个会用弹出列表让你选 py/js/html/json/css)。txt 和 md 建完直接进重命名;docx 和 xlsx 用模板复制,模板里已经设好了样式和表头;代码文件建完自动用默认编辑器打开。
另外留了一个终端别名作为补充:
newf() { touch "$1" && open -R "$1" }在终端里敲newf a.md,文件建好并自动在访达里定位到它。写脚本、写配置的时候,这个比切到访达右键快得多。
有一件事我踩过一次坑,提醒一下:别把模板目录放在 iCloud 云盘或者任何同步目录下。同步服务偶尔会把模板文件标记为"仅云端",本地只剩一个占位符,脚本cp的时候复制出来的是个空壳,生成的文档打不开。模板目录就放在本地用户资源目录里,最稳。
还有一个小体会:这类小工具的收益不在于"省了几秒",而在于它把"想记点什么"和"开始记"之间的摩擦降到了零。以前想到一句话,要打开应用、新建、保存、选路径、起名字,五步之后那个念头已经凉了。现在右键一点就能敲字,那个念头还热着。效率工具真正的价值,往往就在这种地方。