正如标题所示,我需要将一个文件夹中的多个文件(数千个)压缩成 .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)。