我有一堆 .zip 和 .rar 文件。其中许多文件在存档中包含子文件夹。我想从 zip 文件中删除所有文件夹,但保留其他内容。
例如
original.zip
- /foo/bar1.jpg
- /foo/bar2.jpg
- /foo/bar3.jpg
- /foo/bar4.jpg
>>>
new.zip
- bar1.jpg
- bar2.jpg
- bar3.jpg
- bar4.jpg
这可以是纯终端命令或 bash 脚本。我需要能够同时在 100 个 zip/rar 文件上运行它。
更新: 似乎如果不重新创建 zips + rars 就不可能实现这一点。
因此,我编写了一个小型 bash 脚本,它创建了两个目录,“cleaned”用于后处理文件,“temp”用于解压文件。它循环遍历当前目录中的所有档案(.cbr 和 .cbz 文件),为每个新文件创建一个“干净的名称”,将旧文件解压到临时目录,从临时文件创建一个新档案,并将其以干净的名称保存在“cleaned”目录中,然后清除临时文件夹。处理完所有文件后,“temp”目录将被递归删除。它如下所示:
#!/bin/bash
echo "comic cleaning!";
echo "---------------";
dir=$(pwd)/;
tmp=${dir}temp/;
clean=$(pwd)/cleaned;
cd $dir;
mkdir -p cleaned;
mkdir -p temp;
for z in *.cb*; do
cd $dir;
filename=$(basename "$z");
rawname="${filename%.*}";
name="${rawname// /_}";
7z e "$dir$z" -otemp/;
cd $tmp && zip -r $clean/$name.cbz *.jpg;
cd $tmp && rm *.*;
done
cd $dir && rm -rf $tmp;
我可能应该使用 os /tmp 目录,但我对 bash 还不熟悉,无法让它工作。有什么优化建议吗?
答案1
如果所有文件名都是唯一的,您的小脚本可能会起作用。您会遇到这样的情况吗?
original.zip
- /foo/bar1.jpg
- /foo/bar2.jpg
- /zoo/bar1.jpg
- /zoo/bar2.jpg
您将要覆盖文件。更好的解决方案可能是将完整路径作为新文件名的一部分。例如:
foobar1.jpg foobar2.jpg zoobar1.jpg zoobar2.jpg
但这样一来,您将丢失原始文件名。
只是一些想法……