将 Zip 转换为 7zip...Bash 脚本或 (Linux) 命令行

将 Zip 转换为 7zip...Bash 脚本或 (Linux) 命令行

是否可以使以下代码递归?或者更好的是,将 zip 或 rar 存档文件转换为 7z,而根本不提取存档文件?这意味着,我使用类似以下内容的代码:

arepack -e -F 7z *.zip
rm -f *.zip

但我也嵌套了 zip 和一些其他存档文件,例如 rar 文件

使用我的代码,我必须首先提取 zip,(文件夹中有其他 zip 文件 - 嵌套 zip)然后我必须在每个文件夹中打开终端并运行 extractor.sh 文件以提取 zip 并转换为 7z(提取/转换后,我右键单击原始存档,然后使用 linux gui 压缩为 7z)。我希望能够从最顶层的文件夹开始,并让其将所有 zip 转换为 7z(递归)。

或者更好的是,我可以运行 arepack 而不必提取 zip 文件并让它遍历 zip 文件并将所有 zip 和其他档案(例如原始 zip 内的 rar 文件)转换为 7z(动态?)

任何对此的见解都将不胜感激!

谨致问候,布莱恩

答案1

之前不知道arepack这个工具,但是无法使用,因为输出的内容不只是重新打包,还被修改了。

需要解压到一个临时目录,修改内容,然后重新打包。在每个临时目录中都重复上述操作。

大多数压缩算法都可以从 stdin 到 stdout 进行工作,这给人一种可以即时重新打包的印象,但烦人的文件名和其他元数据使得实现这样的事情变得困难。这是可以做到的,也许有一天 arepack 会支持它。

我没有执行下面的代码。aunpack 和 apack 调用可能需要改进。

#!/bin/bash
# Fun academic problem.

set -u # help find undefined variables

# Assume: /var/run is pseudo-filesystem in RAM

repackage()
{
    [[ ! ${1-} ]] && { echo "${FUNCNAME[0]}: called without arg"; exit 1; }
    local input_pkg="$1"
    local input_pkg_basename="${input_pkg#*.}"

    local tmp_dir=$( mktemp --dry-run --directory /var/run/rpgk_tmp_XXXXXX )
    mkdir "$tmp_dir" ||  { echo "${FUNCNAME[0]}: failed to create $tmp_dir"; return; }

    aunpack --extract-to="$tmp_dir" "$input_pkg"

    find "$tmp_dir" -name \*.rar -o -name \*.tar -0 |
        while IFS= read -r -d '' fname; do
            repackage "$fname"
        done

    local dest_fname="$input_pkg_basename".7z
    apack -F 7z "$dest_fname" "$tmp_dir"
    rm -fr "$tmp_dir"
}

repackage "$1"

相关内容