如何使用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并开启对应配置即可,不需要额外写循环创建目录:
- 先执行加载和配置命令:
开启该配置后,zmv执行移动操作前会自动调用autoload -Uz zmv zstyle ':zmv' mkdir-p truemkdir -p创建目标路径需要的所有层级父目录。 - 分三类文件执行移动操作,第一次执行请加
-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'
- 移动1倍率原图到对应图标名的根目录:
方法二:预创建所有目标目录后再执行移动
如果不想修改zmv的默认配置,可以先遍历所有文件提前创建需要的目录,再执行移动操作:
- 执行预创建目录的脚本:
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 - 目录创建完成后,再执行方法一中的三条zmv移动命令即可,不会再出现目录不存在的报错。
内容的提问来源于stack exchange,提问作者cSharp
相关产品推荐
相关产品推荐

