为此,我会使用 Automator Folder Action 和 Run Shell Script action 以及设置如下图所示,同时将 Run Shell Script action 中的默认 code 替换为以下 example shell脚本 代码:
p="$HOME/Photos"
for f in "$@"; do
[ -f "${f}" ] || continue
fn="${f##*/}"
[[ ${fn} =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}.* ]] || continue
y="${fn:0:4}"
m="${fn:5:2}"
mkdir -p "${p}/${y}/${y}-${m}/${y}-${m} - To Sort" || exit
mv -n "${f}" "${p}/${y}/${y}-${m}/${y}-${m} - To Sort"
done
为了测试 示例 shell 脚本 代码,我创建了 Photos 和 Photos to Sort folders 在我的 Home 文件夹 中,并将后者分配给我的 中的 Folder Action Automator 工作流程。
在照片 文件夹或要排序的照片文件中没有任何子文件夹 /strong> 文件夹,我将以下文件拖放到要排序的照片 文件夹:
- 2020-12-31 - 文件.jpg
- 2021-01-12 - 文件.mp4
- 2021-01-16 - 文件.jpg
- 2021-02-24 - 文件.jpg
- 2021-03-25 - file.mov
这样做后,这会触发 Automator 文件夹操作 将 文件 移动到适当的分层文件夹结构 如下图:
Photos % tree
.
├── 2020
│ └── 2020-12
│ └── 2020-12 - To Sort
│ └── 2020-12-31 - file.jpg
└── 2021
├── 2021-01
│ └── 2021-01 - To Sort
│ ├── 2021-01-12 - file.mp4
│ └── 2021-01-16 - file.jpg
├── 2021-02
│ └── 2021-02 - To Sort
│ └── 2021-02-24 - file.jpg
└── 2021-03
└── 2021-03 - To Sort
└── 2021-03-25 - file.mov
10 directories, 5 files
Photos %
注意事项:
在这个特殊的用例 IMO 中,编写 shell 脚本代码 比编写 AppleScript 代码 要容易得多,这也是我走这条路的原因。
由于-n 选项,编码后的mv 命令 不会覆盖现有的文件。如果您希望覆盖现有的文件,请从mv 命令中删除-n 选项。
shell 脚本 会检查放入文件夹 并分配给文件夹操作 的内容是文件 或继续到下一个 Finder item 如果超过一个被丢弃。
它检查 文件名 是否在例如YYYY-MM-DD ... 格式或继续到下一个 Finder item 如果多个被丢弃。
根据需要创建目标分层文件夹结构,然后将目标文件移动到适当的目标文件夹。
用于显示照片 文件夹内容的tree 命令不是默认的macOS 命令。
Shell 脚本变量命名法:
- f = 完全限定路径名
- fn = 带扩展名的文件名
- y = 年
- m = 月