You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用zmv批量移动文件并按文件名动态创建对应子目录?

批量按规则移动图片并自动创建目录的zmv实现方案

问题背景

当前assets目录初始文件结构如下:

assets/
├─ icon_1.png
├─ icon_1@2x.png
├─ icon_1@3x.png
├─ icon_2.png
├─ icon_2@2x.png
├─ icon_2@3x.png

需要调整为如下目标结构:

assets/
├─ icon_1/
│  ├─ 3.0x/
│  │  ├─ icon_1.png
│  ├─ 2.0x/
│  │  ├─ icon_1.png
│  ├─ icon_1.png
├─ icon_2/
│  ├─ 3.0x/
│  │  ├─ icon_2.png
│  ├─ 2.0x/
│  │  ├─ icon_2.png

测试执行以下两条zmv命令时,均收到「目标目录不存在」的报错:

zmv '(*).png' $1/'$1.png'
zmv '(*).png' '$1/$1.png'

原因说明

zmv默认不会自动创建目标路径对应的父目录,当目标路径指向未创建的多级子目录时,就会抛出目录不存在的错误。

解决方法

方法一:开启zmv自动创建父目录配置(推荐)

zmv原生支持自动创建父目录的开关,只需要提前加载zmv并开启对应配置即可,不需要额外写循环创建目录:

  1. 先执行加载和配置命令:
    autoload -Uz zmv
    zstyle ':zmv' mkdir-p true
    
    开启该配置后,zmv执行移动操作前会自动调用mkdir -p创建目标路径需要的所有层级父目录。
  2. 分三类文件执行移动操作,第一次执行请加-n参数做干跑预览,确认移动规则符合预期后再去掉-n执行正式操作:
    • 移动1倍率原图到对应图标名的根目录:
      # 干跑预览
      zmv -n '(icon_<->).png' '$1/$1.png'
      # 确认无误后执行正式移动
      zmv '(icon_<->).png' '$1/$1.png'
      
    • 移动@2x倍率图到对应目录下的2.0x子目录:
      # 干跑预览
      zmv -n '(*@)2x.png' '${1%@}/2.0x/${1%@}.png'
      # 确认无误后执行正式移动
      zmv '(*@)2x.png' '${1%@}/2.0x/${1%@}.png'
      
    • 移动@3x倍率图到对应目录下的3.0x子目录:
      # 干跑预览
      zmv -n '(*@)3x.png' '${1%@}/3.0x/${1%@}.png'
      # 确认无误后执行正式移动
      zmv '(*@)3x.png' '${1%@}/3.0x/${1%@}.png'
      

方法二:预创建所有目标目录后再执行移动

如果不想修改zmv的默认配置,可以先遍历所有文件提前创建需要的目录,再执行移动操作:

  1. 执行预创建目录的脚本:
    for file in icon_*.png; do
      base_name=${file%.png}
      if [[ $base_name =~ "^(icon_[0-9]+)@([23])x$" ]]; then
        # 处理带@2x/@3x后缀的文件,创建对应倍率子目录
        mkdir -p "${match[1]}/${match[2]}.0x"
      else
        # 处理1倍率原图,创建图标根目录
        mkdir -p "$base_name"
      fi
    done
    
  2. 目录创建完成后,再执行方法一中的三条zmv移动命令即可,不会再出现目录不存在的报错。

内容的提问来源于stack exchange,提问作者cSharp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:09:17