是否可以使以下代码递归?或者更好的是,将 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"