我有一个包含 800 个文件的目录,如下所示:
file1.png
[email protected]
file2.png
[email protected]
file3.png
[email protected]
... etc
我需要创建这样的 zip 文件
file1.zip (containing file1.png and [email protected])
file2.zip (containing file2.png and [email protected])
file3.zip (containing file3.png and [email protected])
我可以使用魔法命令来做到这一点吗?
答案1
如果总是有两个,很简单:
for f in file+([0-9]).png; do zip "${f%png}zip" "$f" "${f/./@2x.}"; done
请注意,上述内容将按原样从命令行运行。如果您打算在脚本中使用它,请将该行放在shopt -s extglob
该行之前的某个位置。 (extglob
默认情况下仅在交互式 shell 中启用。)
在旧的bash
不处理扩展模式中,这个丑陋的解决方法会起作用,但最好改变逻辑正如另一个答案中所建议的作者:列昂尼德:
for f in file[0-9].png file*[0-9][0-9].png; do zip "${f%png}zip" "$f" "${f/./@2x.}"; done
答案2
对 manatwork 建议的内容进行稍微修改的版本怎么样?像这样的东西:
for f in file*@2x.png; do zip ${f%@2x.png}.zip $f ${f/@2x./.}; done
它仅迭代“成对的第二个”文件,并且文件列表生成中没有正则表达式。