两两压缩文件

Duc*_*uck 3 command-line bash zip wildcards

我有一个包含 800 个文件的目录,如下所示:

file1.png
file1@2x.png

file2.png
file2@2x.png

file3.png
file3@2x.png

... etc
Run Code Online (Sandbox Code Playgroud)

我需要创建这样的 zip 文件

file1.zip (containing file1.png and file1@2x.png)
file2.zip (containing file2.png and file2@2x.png)
file3.zip (containing file3.png and file3@2x.png)
Run Code Online (Sandbox Code Playgroud)

有没有我可以使用的魔法命令来做到这一点?

man*_*ork 5

如果总是有两个,很简单:

for f in file+([0-9]).png; do zip "${f%png}zip" "$f" "${f/./@2x.}"; done
Run Code Online (Sandbox Code Playgroud)

请注意,上述内容将按原样从命令行工作。如果您打算在脚本中使用它,请将其shopt -s extglob放在该行之前的某个位置。(extglob默认情况下仅在交互式 shell 中启用。)

在旧的bash不处理扩展模式中,这种丑陋的解决方法将起作用,但更好地更改逻辑,Leonid 的另一个答案中所建议的

for f in file[0-9].png file*[0-9][0-9].png; do zip "${f%png}zip" "$f" "${f/./@2x.}"; done
Run Code Online (Sandbox Code Playgroud)