问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

macOS命令行批量复制指定文件名的文件

创作时间:
作者:
@小白创作中心

macOS命令行批量复制指定文件名的文件

引用
1
来源
1.
https://www.tutouzhang.com/post/107.html

在macOS系统中,如果你需要将大量指定名称的文件从一个目录复制到另一个目录,可以使用命令行工具来实现这一需求。本文将介绍两种方法:直接使用文件名列表和动态读取文件名列表。

准备工作

  1. 文件路径
  • 源文件存储路径:/Volumes/婚礼/DCIM(包含子文件夹)
  • 目标文件夹:/Volumes/婚礼/DCIM/matched_photos
  1. 编号列表
  • 编号保存在文本文件/Volumes/婚礼/DCIM/numbers.txt中,内容格式如下:
    0182,0178,0168,0165,0163,...
    
  1. 环境
  • macOS系统(使用zsh 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. 使用终端命令搜索和复制文件

直接将文件名列表写入命令,并设置权限:

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已存在,内容为逗号分隔的编号:

0182,0178,0168,0165,0163,...

2. 使用终端命令读取和处理

以下命令会读取numbers.txt,将编号转换为文件名格式并执行搜索,同时设置权限:

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
    
  1. 文件名不匹配
  • 查看实际文件名:
    find /Volumes/婚礼/DCIM -type f | head -n 10
    
  1. 子文件夹未包含
  • find默认递归搜索子文件夹。可以测试单个文件:
    find /Volumes/婚礼/DCIM -type f -name "IMG_0182.CR2"
    
  1. numbers.txt读取问题
  • 检查文件内容:
    cat /Volumes/婚礼/DCIM/numbers.txt
    
  1. 权限问题
  • 如果仍无法查看或编辑文件,检查权限:
    ls -l /Volumes/婚礼/DCIM/matched_photos
    

测试截图

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号