问题描述
希望优化我的摄影工作流程,我想根据文件名的开头自动将 (a) 主文件夹中的图片和视频移动到一组文件夹的子文件夹中 - 全部基于年和月,即 YYYY -毫米。理想情况下,它应该在每次定义的主文件夹中出现新文件时运行,但如果这不简单,我可以拥有一个我应该手动运行或以其他方式运行的 droplet/应用程序。>
我不是程序员,也不会编写脚本,但是当外行人有明显的逻辑时,我可以理解大多数事情。我已经阅读了许多类似的帖子,但没有一个提供我可以使用的明显答案和/或弄清楚如何适应我正在尝试对我的文件和文件夹层次结构执行的操作。据我所知,人们是如何使用 Applescript 或其他脚本语言(?)做这些事情的,对于合适的人,我认为/希望这是一个简单的问题。
除了视觉之外,我没有很好的方法来解释我想要做什么,所以就这样吧。如果您有任何问题,请告诉我。谢谢!
解决方法
为此,我将使用 Automator Folder Action 和 Run Shell Script action 和设置如下图所示,同时将运行 Shell 脚本操作中的默认代码替换为以下示例 > 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脚本代码,我创建了照片和要排序的照片 文件夹在我的主页 文件夹中,并将后者分配给我中的文件夹操作 Automator 工作流程。
开始时照片文件夹或要排序的照片文件中没有任何子文件夹 /strong> 文件夹,我将以下文件拖放到了要排序的照片文件夹:
- 2020-12-31 - 文件.jpg
- 2021-01-12 - file.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 代码要容易得多,这也是我走这条路的原因。
由于mv
选项,编码的-n
命令不会覆盖现有的文件。如果您想覆盖现有的文件,请从 -n
command 中删除 mv
option。
shell 脚本检查放入分配给文件夹操作的文件夹中的内容是文件或继续下一个 Finder item 如果被丢弃的东西不止一个。
它检查 filename 是否在例如YYYY-MM-DD ... 格式或继续到下一个 Finder item 如果删除的项目不止一个。
根据需要创建目标分层文件夹结构,然后将目标文件移动到适当的目标文件夹。
用于显示照片文件夹内容的tree
命令不是默认的macOS 命令。
Shell 脚本变量命名法:
- f = 全限定路径名
- fn = 带扩展名的文件名
- y = 年
- m = 月