上次拍完婚礼后,有两千多张的照片,今天挑了一些,只记了一下照片的名称中的数字,本以为mac的文件搜索可以做到用英文逗号分隔进行快速搜索,谁知道居然做不到,那么这个时候就要动脑想一下了。
未在Windows上测试过
一定要在sudo的权限下使用命令
准备工作 1. *文件路径*:
- 我的照片存储在
/Volumes/婚礼/DCIM
(包含子文件夹)。 - 目标是将匹配的文件复制到
/Volumes/婚礼/DCIM/matched_photos
。 - *编号列表*: - 我有一个逗号分隔的编号列表,保存在文本文件
/Volumes/婚礼/DCIM/numbers.txt
中,内容如下:
0182,0178,0168,0165,0163,...
- 需要将这些编号转换为文件名格式:
IMG_编号.CR2
(例如IMG_0182.CR2
)。
- 环境:
- macOS 系统(我用的是 zsh shell,macOS 默认 shell)。
方案 1:直接使用文件名列表
1. 准备编号文件
确保你的编号列表已经保存为文本文件。如果没有,可以手动创建:
- 打开“文本编辑”(TextEdit)。
- 输入编号,例如:
0182,0178,0168,0165,0163,...
- 保存为
/Volumes/婚礼/DCIM/numbers.txt
(确保保存为纯文本格式,避免富文本)。
2. 将编号转换为文件名格式
我的照片文件名格式是 IMG_XXXX.CR2
,所以需要将编号加上前缀 IMG_
和后缀 .CR2
。可以用文本编辑器的“查找和替换”功能:
- 查找
,
,替换为.CR2,IMG_
。 - 手动在开头加
IMG_
,结尾加.CR2
。 - 示例结果(部分):
IMG_0182.CR2,IMG_0178.CR2,IMG_0168.CR2,...
3. 使用终端命令搜索和复制文件
直接将文件名列表写入命令,并设置权限:
打开终端
- 按
Command + 空格
,输入“终端”(Terminal),回车。
输入命令
将以下命令复制到终端并运行(这里只展示部分文件名,完整列表包含 151 个):
♾️ zsh 代码:mkdir -p /Volumes/婚礼/DCIM/matched_photos && chmod 777 /Volumes/婚礼/DCIM/matched_photos && numbers=(IMG_0182.CR2 IMG_0178.CR2 IMG_0168.CR2 IMG_0165.CR2 IMG_0163.CR2) && for number in $numbers; do find /Volumes/婚礼/DCIM -type f -name "$number" -exec cp {} /Volumes/婚礼/DCIM/matched_photos/ \; ; done && chmod 777 /Volumes/婚礼/DCIM/matched_photos/*
命令说明:
- mkdir -p /Volumes/婚礼/DCIM/matched_photos:创建目标文件夹。
- chmod 777 /Volumes/婚礼/DCIM/matched_photos:为目标文件夹设置 777 权限。
- numbers=(...):定义文件名数组,直接使用转换后的文件名。
- find /Volumes/婚礼/DCIM -type f -name "$number":在 /Volumes/婚礼/DCIM 及其子文件夹中搜索精确匹配的文件名。
- -exec cp {} /Volumes/婚礼/DCIM/matched_photos/ \;:将找到的文件复制到新文件夹。
- chmod 777 /Volumes/婚礼/DCIM/matched_photos/*:为复制后的所有文件设置 777 权限。
方案 2:动态读取 numbers.txt 文件
如果你的编号列表可能会变化,或者你希望更灵活地管理文件,可以利用 numbers.txt,动态读取编号并生成文件名。
1. 准备编号文件
确保 /Volumes/婚礼/DCIM/numbers.txt 已存在,内容为逗号分隔的编号:
♾️ php 代码:0182,0178,0168,0165,0163,...
2. 使用终端命令读取和处理
以下命令会读取 numbers.txt,将编号转换为文件名格式并执行搜索,同时设置权限:
3.打开终端
- 按 Command + 空格,输入“终端”(Terminal),回车。
4.输入命令
将以下命令复制到终端并运行:
♾️ yacas 代码:mkdir -p /Volumes/婚礼/DCIM/matched_photos && chmod 777 /Volumes/婚礼/DCIM/matched_photos && numbers=($(cat /Volumes/婚礼/DCIM/numbers.txt | tr ',' ' ')) && for number in $numbers; do find /Volumes/婚礼/DCIM -type f -name "IMG_${number}.CR2" -exec cp {} /Volumes/婚礼/DCIM/matched_photos/ \; ; done && chmod 777 /Volumes/婚礼/DCIM/matched_photos/*
命令说明:
- mkdir -p /Volumes/婚礼/DCIM/matched_photos:创建目标文件夹。
- chmod 777 /Volumes/婚礼/DCIM/matched_photos:为目标文件夹设置 777 权限。
- numbers=($(cat /Volumes/婚礼/DCIM/numbers.txt | tr ',' ' '))
- cat 读取 numbers.txt。
- tr ',' ' ' 将逗号替换为空格,生成 zsh 数组。
- for number in $numbers; do ...:遍历每个编号(例如 0182)。
- -name "IMG_${number}.CR2":动态生成文件名,例如 IMG_0182.CR2。
- -exec cp {} /Volumes/婚礼/DCIM/matched_photos/ \;:将找到的文件复制到新文件夹。
- chmod 777 /Volumes/婚礼/DCIM/matched_photos/*:为复制后的所有文件设置 777 权限。
优点:
- 如果需要更改编号,只需编辑 numbers.txt,无需修改命令。
- 更灵活,适合动态需求。
常见问题
1. 路径错误
- 检查磁盘是否挂载:
ls /Volumes/婚礼/DCIM
. 文件名不匹配
- 查看实际文件名:
find /Volumes/婚礼/DCIM -type f | head -n 10
3. 子文件夹未包含
- find 默认递归搜索子文件夹。可以测试单个文件:
find /Volumes/婚礼/DCIM -type f -name "IMG_0182.CR2"
4. numbers.txt 读取问题
- 检查文件内容:
cat /Volumes/婚礼/DCIM/numbers.txt
5. 权限问题
- 如果仍无法查看或编辑文件,检查权限:
ls -l /Volumes/婚礼/DCIM/matched_photos
文件夹如果不存在的话,请手动创建一下,我再测试的时候是已经有了文件夹的,没有文件夹的情况还没有测试过
测试截图

后期计划
后期准备直接做个命令行运行的工具,或者是直接集成软件,虽然现在已经有很多的软件支持这些功能了
👍
💖
💯
💦
😄
🪙
博主
秃头张👍
💖
💯
💦
😄
🪙
👍
💖
💯
💦
😄
🪙
👍
💖
💯
💦
😄
🪙
👍
💖
💯
💦
😄
🪙
👍
💖
💯
💦
😄
🪙
👍
💖
💯
💦
😄
🪙
👍
💖
💯
💦
😄
🪙