批量重命名文件到子目录



我有以下文件:

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'

来了解它是如何工作的。然而,它告诉我,我没有正确的目录。有没有办法从文件名动态创建目录?

我真的无法找到一种方法来参数化后缀并动态创建目录,但是我确实找到了针对我的特定情况的解决方案。

我在zsh上运行以下命令:

for file in *@3x.png
do
dirname="${file%@3x.png}" #this truncates the @3x.png from 'icon_1@3x.png' and so on
mkdir "$dirname"
mkdir "$dirname/2.0x"
mkdir "$dirname/3.0x"
done

创建我想要的文件夹结构。现在我只需要将文件从./移动到所需的目录,如下所示:

zmv '(*)@3x.png' '$1/3.0x/$1.png'
zmv '(*)@2x.png' '$1/2.0x/$1.png'
zmv '(*).png' '$1/$1.png'

我先移动带有@3x,@2x后缀的那些,这样它们就不会被(*).png选择器选中。

这可以用zmv完成,但是您可能需要一个稍微复杂的模式。如果目标目录存在,这将移动文件:

zmv -n '(icon_<->)(*).png' '${1:r}/${${2#@}%x}${2:+.0x}/$1.png'

-n (no-execute)选项用于测试-删除它以实际移动文件。扩展的glob模式<->匹配任何数字;它让我们把源模式分成两部分。目标模式使用几个zsh参数展开来构建路径,对于icon_1icon_2目录,重复的正斜杠被视为单个斜杠。


开箱后,zmv不会创建目录,但它会接受一个可以调用mkdir的自定义命令:

mkdir_mv () {
mkdir -p -- $3:h
mv -- $2 $3
}
zmv -n -p mkdir_mv '(icon_<->)(*).png' '${1:r}/${${2#@}%x}${2:+.0x}/$1.png'

mkdir_mv代码来自此回答。

相关内容

  • 没有找到相关文章

最新更新