如何对多个文件进行 .zip 压缩并保留其文件名。EX file1.file file2.file -> file1.zip file2.zip

如何对多个文件进行 .zip 压缩并保留其文件名。EX file1.file file2.file -> file1.zip file2.zip

正如标题所示,我需要将一个文件夹中的多个文件(数千个)压缩成 .zip 文件,然后将每个文件压缩到自己的存档中,并以原始文件名作为 .zip 文件名。

如果我尝试使用 gzip 来做到这一点,这很简单:

   $gzip *.fileextension

它将对每个文件进行 .gz 压缩,删除原始文件并将其重命名为原始文件名

示例输入:file1.txt file2.txt file3.txt

输出:file1.gz file2.gz file3.gz

我如何使用 .ZIP 来实现这一点?

答案1

您可以创建一个小型的 bash shellscript zipsep

#!/bin/bash

for i in "$@"
do
 zip "$i".zip "$i"
done

使其可执行,

chmod +x zipsep

将其移动到 PATH 中的目录,

sudo mv zipsep /usr/local/bin

现在你可以zipsep分别压缩每个文件,例如

zipsep *.txt

如果你想删除原始文件,你可以在上面的示例中单独执行此操作

rm *.txt

如果只有几个文件则以交互方式(更安全)

rm -i *.txt

也可以将删除操作放入 shellscript 中,但我更愿意单独执行此操作。


file1.txt编辑:如果具有相同名称但具有不同扩展名的文件(例如和file1.doc和)不会出现问题file2.pdf,则可以使用 bash 参数替换从 zip 文件名中删除原始扩展名。查看man bash并搜索“参数扩展”和${parameter%word}“删除匹配的后缀模式”。

#!/bin/bash

for i in "$@"
do
 zip "${i%.*}".zip "$i"
done

如果你已经创建了 zip 文件而没有删除原始扩展名,则可以使用以下命令来检查它是否按预期“试运行”运行,

rename -n 's/\.[a-zA-Z0-9]*\././' *.zip

然后删除-n执行此操作的选项,

rename 's/\.[a-zA-Z0-9]*\././' *.zip

使用此方法,如果原始文件具有相同的名称和不同的扩展名,您将避免覆盖。至少我的版本rename将拒绝覆盖,'perl rename':参见man rename

原始“重命名”功能未检查目标文件名是否存在,因此必须谨慎使用。我希望我已经修复了这个问题(Robin Barker)。

相关内容