两两压缩文件


3

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

file1.png
file1@2x.png

file2.png
file2@2x.png

file3.png
file3@2x.png

... etc

我需要像这样创建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)

有什么我可以用来执行的魔术命令吗?

Answers:


5

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

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

请注意,上面的命令将按命令行运行。如果要在脚本中使用它,请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

我在尝试您的命令后收到此错误... -bash:意外令牌'('附近的语法错误
SpaceDog 2012年

我正在命令行中尝试并看到此错误
SpaceDog 2012年

bash您使用哪个版本?我的是4.2.37。
manatwork 2012年

1
extglob默认情况下不会在交互shell中启用的,但也许你的操作系统附带了bashrc那个打开它(并已加入extglob在2.02-α1来砸)
斯特凡Chazelas

1
否,--enable-extended默认情况下(opt_extended_glob=yesin configre)已启用,但未启用--enable-extended-glob-defaultopt_extglob_default=no),这在文档中是不准确的。它必须已由您的OS维护者明确启用。但是要注意的是,不同的bash分布具有不同的默认值。
斯特凡Chazelas

4

对manatwork建议的内容进行稍微修改的版本怎么样?像这样: for f in file*@2x.png; do zip ${f%@2x.png}.zip $f ${f/@2x./.}; done

它仅遍历“成对第二”文件,并且文件列表生成中没有正则表达式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.