要清空可重复使用的输出文件夹,同时保留文件夹本身,请创建一个只删除其子项的 Mac 快捷指令。本指南使用固定文件夹、临时文本文件和一个会在清空前检查文件夹的 shell 脚本。
此任务是在每批生成文件之间重置一个文件夹。示例包括普通文件、名称中含空格的文件、隐藏文件和嵌套文件夹。脚本会直接删除这些内容,不会将它们移到废纸篓。Apple 发布的 rm 手册说明了递归删除和错误报告。Apple 的 rm 手册
决定清空后应保留什么
在此工作流程中,预期结果是原路径下仍有一个已存在的空文件夹。里面的任何子文件夹也属于输出,因此会连同其内容一起删除。如果你的输出目录中包含模板或需要永久保留的子文件夹结构,那么在使用此脚本之前,需要采用不同的选择规则。
示例目标文件夹是直接位于你的个人文件夹中的 Shortcut Output Demo。固定目标路径便于检查快捷指令:其行为不会受当前打开的 Finder 窗口或当前选中文件的影响。
| 要求 | 本指南中的行为 |
|---|---|
| 保留输出文件夹 | 仅将子路径传递给 rm |
| 包含隐藏输出 | Bash 的 dotglob 选项会包含以点号开头的名称 |
| 处理已为空的文件夹 | 接受空的子项列表 |
| 处理缺失的文件夹 | 停止并报错;不重新创建文件夹 |
| 删除嵌套输出 | 递归删除每个子文件夹 |
| 保留使用 Finder“放回原处”的能力 | 改用下方的 Finder 替代方法 |
如果你希望项目保留在废纸篓中,Finder 提供了一个实用的替代方法。打开输出文件夹,选中其中可丢弃的项目,然后按 Command-Delete。不要选中包含这些项目的文件夹。Apple 说明,移到废纸篓的项目会一直留在那里,直到清空废纸篓,并且可以通过 文件 > 放回原处 恢复。在 Mac 上删除文件和文件夹
为首次运行创建一个临时文件夹
打开“终端”,粘贴下面完整的设置代码块。它只会创建虚构的文本文件。必须先成功执行初始的 mkdir,之后才会写入任何文件,因此如果名为 Shortcut Output Demo 的文件或文件夹已存在,设置过程会停止,而不会重复使用其中的内容。
/bin/bash <<'BASH'
set -eu
target="$HOME/Shortcut Output Demo"
if ! /bin/mkdir "$target"; then
printf 'Setup stopped: choose an unused demo folder name.\n' >&2
exit 1
fi
/bin/mkdir "$target/Batch"
printf 'Synthetic output A\n' > "$target/alpha.txt"
printf 'Synthetic output B\n' > "$target/sample output.txt"
printf 'Synthetic marker\n' > "$target/.demo-marker"
printf 'Synthetic nested output\n' > "$target/Batch/nested.txt"
printf 'Created disposable examples in: %s\n' "$target"
BASH
在 Finder 中打开你的个人文件夹,找到 Shortcut Output Demo。其中有三个可见子项:alpha.txt、sample output.txt 和 Batch。第四个子项 .demo-marker 是故意设为隐藏的。Batch 中还有 nested.txt。这些都是用于示例的测试输入,不是现有用户文件。
如果设置过程因为名称已存在而停止,请保留那个已有项目。选择另一个未使用的演示名称,并在设置代码和清理脚本中都修改目标赋值,使其与新名称一致。不要为了绕过冲突而移除初始创建检查。
构建快捷指令并保留其输入和输出类型
在“快捷指令”中,点按添加按钮来创建快捷指令,并将其命名为 Clear Demo Output。在操作列表中搜索 Run Shell Script,然后添加该操作。Apple 说明了如何通过添加操作来创建快捷指令,以及如何按名称搜索操作列表。在 Mac 上创建自定义快捷指令、在 Mac 上浏览“快捷指令”的操作列表
将该操作的 Shell 设为 /bin/bash,然后用下面完整的清理脚本替换示例命令。此脚本使用 Bash 数组和 shopt,因此请保留该 shell 选项。脚本从其中的赋值语句读取目标路径;它不会接收快捷指令输入、标准输入或命令行参数。
如果脚本功能已停用,请选择 快捷指令 > 设置,打开“高级”,并启用“允许运行脚本”。Apple 说明了此设置用于从快捷指令运行脚本。Apple 的脚本运行设置
set -u
target="$HOME/Shortcut Output Demo"
if [[ ! -d "$target" || -L "$target" ]]; then
printf 'Expected an existing ordinary folder: %s\n' "$target" >&2
exit 1
fi
if [[ ! -r "$target" || ! -x "$target" ]]; then
printf 'Cannot list the output folder.\n' >&2
exit 1
fi
unset GLOBIGNORE
set +f
shopt -u failglob
shopt -s dotglob nullglob
items=( "$target"/* )
for item in "${items[@]}"; do
if ! /bin/rm -R -- "$item"; then
printf 'Clearing stopped; some items may remain.\n' >&2
exit 1
fi
done
remaining=( "$target"/* )
if (( ${#remaining[@]} != 0 )); then
printf 'The folder still contains items.\n' >&2
exit 1
fi
printf 'Folder is empty: %s\n' "$target"
操作成功时输出的是文本:以 Folder is empty: 开头的一行。它不是文件夹对象、已删除文件列表,也不是指向可重复使用目录的引用。如果之后扩展快捷指令,请明确地向任何需要文件夹的操作提供目标文件夹。Apple 的操作信息面板会标明可接受的输入和生成的输出;按住 Control 键点按操作图标,然后选取 Show Info 即可查看。查看操作的输入和输出信息
若要显示完成提示,请在脚本后添加 Show Alert,并将脚本的输出变量插入其消息中。Apple 说明了如何将上一个操作的输出传递给 Show Alert 进行检查。显示脚本的实际结果,比使用一条固定的“文件夹已空”消息更有用。在 Mac 快捷指令中使用“显示提醒”操作
了解文件夹为何会保留下来
赋值语句 items=( "$target"/* ) 会收集子路径。循环会将每个子项单独传递给 rm;它不会传递 "$target" 本身。因此,递归删除会作用于输出子文件夹,同时保留可重复使用的父文件夹。
两个 Bash 选项可以处理常见的重置问题。dotglob 会包含以点号开头的文件名,而 nullglob 会让不匹配的模式展开为空。带引号的数组展开会将含空格的文件名保留为独立参数。Apple 随附的 Bash 手册记录了这些行为。Bash 手册:路径名展开和数组
删除命令使用 -R 处理嵌套文件夹,并使用 -- 结束选项解析。脚本会检查每条命令的结果,并在失败时停止。Apple 的 rm 手册规定,发生错误时会返回非零退出状态。删除操作不是事务:如果删除后续子项时发生失败,先前已删除的子项不会恢复。Apple 的 rm 手册
脚本也会拒绝将符号链接作为目标。此示例仅适用于普通的本地输出文件夹,其中没有已挂载的宗卷。在清空之前,请停止所有生成输出的进程:运行期间或之后创建的文件可能导致文件夹无法保持为空。
验证首次运行和重复运行
使用编辑器中的运行按钮运行快捷指令。在修改目标路径之前,请按以下步骤检查结果。Apple 说明了如何在编辑器中测试自定义快捷指令。测试自定义快捷指令
- 确认
Shortcut Output Demo仍显示在 Finder 中。 - 确认其中可见的示例文件和
Batch文件夹已消失。 - 确认脚本返回了文件夹为空的消息;其最终检查也包括隐藏子项。
- 再次运行快捷指令。文件夹已经为空时,应显示相同的消息。
- 暂时重命名这个空的演示文件夹,然后再次运行。脚本应因目标文件夹不存在而停止并报错。之后恢复其名称。
清理脚本已通过 bash -n 语法检查。本文未在 macOS 的“快捷指令”中实际执行过该脚本,因此设置中仍需包含首次运行的临时测试步骤。
如果删除失败,请在重试前检查报告中提到的项目以及文件夹中剩余的内容。目标缺失、目录不可读和删除失败是不同的情况;脚本不会将它们伪装成成功消息。
重复使用文件夹,但不要假设会处理名称冲突
确认临时测试符合预期后,将目标赋值更改为你选定的输出文件夹。先检查其中的内容,并保持相同约定:其中所有内容都是可替换的输出,包括隐藏项目和子文件夹。
清空文件夹会删除当时已有的名称,但不会规定之后的导出或保存操作如何处理两个名称相同的新输出。请检查该操作自身的选项和说明,不要假设重置会启用替换、合并或自动重命名。Apple 可通过 Show Info 提供操作说明。检查操作的行为
你也可以使用下面的完整命令,从终端运行已保存的快捷指令。Apple 说明了如何为含空格的快捷指令名称加引号,并指出 shortcuts 命令成功时会返回 0,出错时会返回 1。从命令行运行快捷指令
shortcuts run "Clear Demo Output"
按明确的顺序清空并生成输出:完成上一批,清空选定的文件夹,检查结果,然后创建下一批。这样一来,可重复使用的文件夹用途明确,重复运行时也更可预测。
来源
- 在 Mac 上创建自定义快捷指令 — Apple 支持。
- 在 Mac 上浏览“快捷指令”的操作列表 — Apple 支持。
- Mac 上“快捷指令”的高级隐私与安全性设置 — Apple 支持。
- 在 Mac 快捷指令中使用“显示提醒”操作 — Apple 支持。
- 在 Mac 上删除文件和文件夹 — Apple 支持。
- 从命令行运行快捷指令 — Apple 支持。
- rm.1 — Apple 开源发行版。
- bash.1 — Apple 开源发行版。