我有一个问题。我需要压缩一个根文件夹,但其子文件夹中有很多 ZIP/BZIP/TAR 文件。有人可以向我展示一个脚本,该脚本将搜索并解压缩每个子文件夹的 zip 文件,然后以最大压缩率对根文件夹进行 7-zip 压缩吗?
答案1
需要注意的是,7z
它不存储文件的所有者/组等,因此不能正确尊重权限。它不太适合在 Unix 上备份,因此我tar.7z
在下面的脚本中使用了它,它仍然可以提供良好的压缩效果。如果您确实想要,您可以只指定.7z
,但您将丢失权限数据。
您需要atool
从存储库安装,因为我使用它来简化各种格式的提取。您还需要p7zip
:
sudo apt-get install atool p7zip
只需在文本编辑器中输入以下脚本,保存并使其可执行即可。然后在所需文件夹中执行它即可(但请参阅下面的重要说明以了解其工作原理)。
(此脚本中的 find 命令行来自这个问题。
#!/bin/bash
find -mindepth 2 -type f -print -exec mv {} . \;
mkdir my_files
aunpack -e * -X my_files/
apack -O-mx=9 imp_files.tar.7z my_files/
mv imp_files.tar.7z /home/$USER/
exit 0
重要笔记:
所需子文件夹中的文件将被传送到执行脚本的目录中,除非您想将该行添加
cd /home/$USER/"$1"
到脚本顶部并将其放在您的目录中~/bin
,然后用 调用它script_name desired_folder
。找到文件后将其移动到 pwd(当前工作目录),然后创建一个新目录,并将它们全部提取到该目录中。我使用了atools 包中的
aunpack
和 ,apack
因为它们可以同时处理多种存档类型。请参阅我的答案在这里了解更多信息;aunpack
非常棒,因为它允许您提取所有类型的存档文件,而无需单独执行tar
、7z
等。将文件解压到指定文件夹后,该文件夹将打包为 tar 文件,然后打包为最大压缩率的 7zip 文件 (
mx=9
)。最后,将生成的文件移动到主文件夹的底部。
在脚本中,我没有删除从子目录中获取的文件;您可以根据需要添加它,并根据您的需要定制脚本,但我希望这对于学习基本脚本有用。
答案2
尝试写自己的,很有趣!:-)
以下是一些想法和起点:
- 在进行任何实验之前,请复制初始数据!(说真的,你在某些时候会需要备份)
- 创建一个名为 的新脚本
recompress.sh
。 - 使用 使其可执行
chmod +x recompress.sh
。 - 您可以使用 find 获取需要处理的所有文件的列表。这是递归工作的。请参阅这Stackoverflow 答案详情。
- 您必须使用 单独处理 zip 文件,
unzip <fileanme>
使用 处理所有 tar 文件tar xvf <filename>
。Tar 会自动检测存档类型。因此,请制作两个单独的find /folder -name ...
循环。或者找到一个可以处理所有存档类型的工具 :-) - 删除所有解压的档案(记得您已经备份了吗?)
- 使用 压缩所有内容
p7zip
。或者,如果您想自定义压缩级别和其他内容,请7zr
直接使用。
编辑:实际上,如果您逐步构建命令并检查每个命令的错误/输出,可能会容易得多。
答案3
您可以编写脚本或使用 Nautilus 搜索轻松完成此操作。
- 只需搜索
.zip
→ 突出显示所有 zip 文件并选择 →‘在此处提取’ - (可选)删除所有 *.zip 文件
- 对其他文件格式重复此步骤
完成后压缩根文件夹。
快速而肮脏:)
附言:我喜欢终端,但有时 GUI 更快。
PPS:用于tar.xz
压缩根文件夹。