我有以下文件:
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_1
和icon_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
代码来自此回答。