侧边栏壁纸
博主头像
Ivan Zhang

所谓更牛,就是换个罪受

  • 累计撰写 48 篇文章
  • 累计创建 54 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

Linux 支持 zip、unzip 和 zipmerge

Ivan Zhang
2024-01-24 / 0 评论 / 0 点赞 / 635 阅读 / 15,277 字
温馨提示:
本文最后更新于 ,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
有什么问题或观点欢迎评论留言,或者 交流。
如果觉得文章对您有所帮助,可以给博主打赏鼓励一下。

在 Linux 上,有一些常用的工具来支持 zipunzipzipmerge。你可以按照以下步骤来安装这些工具:

1. 使用包管理器更新软件包缓存。

具体命令取决于你所使用的 Linux 发行版,请根据以下示例选择其中之一:

  • 对于 DebianUbuntu
sudo apt update -y
  • 对于 CentOSFedora
sudo yum update -y
  • 对于 Arch Linux
sudo pacman -Sy

安装 zipunzip 工具:

  • 对于 DebianUbuntu
sudo apt install -y zip unzip
  • 对于 CentOSFedora
sudo yum install -y zip unzip
  • 对于 Arch Linux
sudo pacman -S zip unzip

安装 zipmerge 工具:

  • DebianUbuntu 上使用 zipmerge
sudo apt install -y zipmerge
  • CentOSFedora 上,zipmerge 命令在 unzip 软件包中提供:
sudo yum install -y unzip
  • Arch Linux 上,zipmerge 命令在 zip 软件包中提供:
sudo pacman -S zip

安装完成后,你就可以使用 zipunzipzipmerge 命令来管理和合并 zip 文件。

请注意,这些命令需要以 root 或具有 sudo 访问权限的账户运行。如果你没有适当的权限,请联系系统管理员进行安装。

特殊情况

安装 perl-Archive-Zip

CentOS 7 上,默认安装的 unzip 软件包中不包含 zipmerge 命令。要使用 zipmerge 命令,你可以按照以下步骤安装 zipmerge

  1. 首先,安装 epel-release 仓库。在 CentOS 7 上,epel-release 是一个附加软件包库,其中包含了许多其他软件包。
sudo yum install epel-release
  1. 安装 zipmerge
sudo yum install perl-Archive-Zip
  1. 安装完成后,你应该能够使用 zipmerge 命令了。请注意,zipmerge 命令的安装和使用可能因不同的 Linux 发行版而有所不同。

如果你仍然无法使用 zipmerge 命令,请确保你已经成功安装了 epel-release 仓库,并尝试重新安装 perl-Archive-Zip 软件包。有时候会出现 perl-Archive-Zip 软件包中的 zipmerge 命令被禁用或删除的情况。在这种情况下,你可以手动安装 zipmerge 脚本。如果问题仍然存在,你可以查找其他替代的 zip 文件合并工具来完成任务。

手动安装 zipmerge 脚本

请按照以下步骤操作:

  1. 创建一个新目录来存放 zipmerge 脚本:
sudo mkdir /opt/zipmerge
  1. 下载 zipmerge 脚本并将其移动到新创建的目录中:
sudo curl -o /opt/zipmerge/zipmerge https://raw.githubusercontent.com/gregoryszorc/zipmerge/master/zipmerge
  1. 给予 zipmerge 脚本执行权限:
sudo chmod +x /opt/zipmerge/zipmerge
  1. 现在,你可以使用下面的命令来运行 zipmerge
# 直接通过全路径使用
/opt/zipmerge/zipmerge output.zip input1.zip input2.zip ...
# 添加软链接:ln -s <目标文件或目录> <链接文件路径>
sudo ln -s /opt/zipmerge/zipmerge /usr/bin/zipmerge
# 使用示例
zipmerge output.zip input1.zip input2.zip ...

请注意,这种方法使用的是来自 zipmerge 项目的 zipmerge 脚本,并不是由 CentOS 官方提供的软件包。因此,使用之前请了解其中可能的风险和限制。

如果你仍然无法使用 zipmerge 命令,可能需要考虑使用其他的 zip 合并工具来完成任务。

通过 unzip、cat、zip 命令组合

如果以上方案均无法实现 zipmerge 功能,可通过创建一个名为 zipmerge 的脚本,通过组合使用 unzipcatzip 命令来实现 zipmerge 的功能。如果待合并的 zip 文件有规律,你可以使用正则表达式来匹配文件名,并将匹配的文件作为参数传递给 zipmerge 函数。以下是一个支持通过正则表达式来匹配待合并的 zip 文件的函数实现:

注意事项:
以下脚本选项不能连写,如 -cD 是不支持的,需要分开写,如 -c -D,这也是相较 getopt 实现上较不灵活的地方。
该脚本只是提供一种实现思路,实现上超级简单粗暴,将占用大量的硬盘空间,慎用。

#!/bin/bash

#### 使用示例 ####

# 此处以本脚本保存为 /usr/bin/zipmerge 为例

# 合并两个 zip 文件为一个目标 .zip 文件
# 并将同名文件合并为一个文件
# 打印合并详细信息
# 使用方法: zipmerge -v -c 目标.zip file1.zip file2.zip

# 合并三个 zip 文件为一个目标 .zip 文件
# 不合并同名文件
# 不打印合并详细信息
# 使用方法: zipmerge 目标.zip file1.zip file2.zip file3.zip

usage() {
    echo "使用方法: $0 [选项] 目标.zip [zip文件(支持正则匹配)...]"
    echo "选项:"
    echo "  -h, --help    打印帮助信息"
    echo "  -v            打印合并详细信息"
    echo "  -c            合并同名文件为一个文件"
    echo "  -D            忽略文件中的目录(同名文件根据 -c 确认是否合并)"
}

merge_zip() {
    local target_zip=$1
    shift

    # 创建临时目录
    local temp_dir=$(mktemp -d)
    local target_dir=$(mktemp -d)
    local counter=1

    # 解压缩并合并
    for file in "$@"; do
        unzip -q "$file" -d "$temp_dir/zip$counter"
        counter=$((counter + 1))
    done

    # 合并同名文件
    find "$temp_dir" -type f -print0 | while IFS= read -r -d '' file; do
        # 文件名解析
        filename=$(basename "$file")
        if [ "$ignore_directory" != true ]; then
            # 取临时目录后的相对路径
            filename=$(echo "$file" | sed -E "s#^${temp_dir}/zip[0-9]*/##")
        fi

        echo "filename: $filename"
        target_file="$target_dir/$filename"

        if [ "$ignore_directory" != true ]; then
            # 提取目录信息
            directory=$(dirname "$target_file")
            # 创建目录(如果不存在)
            mkdir -p "$directory"
        fi

        if [ "$merge_same_named" = true ]; then
            # 合并文件信息
            echo "cat $file >> $target_file"
            cat "$file" >> "$target_file"
        else
            # 重置重复文件计数
            counter=1
            # 对同名文件添加后缀
            while [ -e "$target_file" ]; do
                target_file="$target_dir/${filename%.*}($counter).${filename##*.}"
                counter=$((counter + 1))
            done

            echo "cp $file $target_file"
            cp "$file" "$target_file"
        fi
    done

    # 压缩目标目录
    local target_zip_dir=$PWD
    cd $target_dir
    zip -q -r "$target_zip_dir/$target_zip" ./

    # 清理临时目录
    rm -rf "$temp_dir"
    rm -rf "$target_dir"
}

target_zip=""
zip_files=()
merge_same_named=false
print_details=false

# 解析命令行参数
while [[ $# -gt 0 ]]; do
    case $1 in
        -h|--help)
            usage
            exit 0
            ;;
        -v)
            print_details=true
            shift
            ;;
        -c)
            merge_same_named=true
            shift
            ;;
        -D)
            ignore_directory=true
            shift
            ;;
        *)
            if [ -z "$target_zip" ]; then
                target_zip="$1"
            else
                zip_files+=("$1")
            fi
            shift
            ;;
    esac
done

# 检查是否提供了目标.zip文件
if [ -z "$target_zip" ]; then
    echo "未指定目标 zip 文件"
    usage
    exit 1
fi

# 检查是否提供了 zip 文件
if [ ${#zip_files[@]} -eq 0 ]; then
    echo "未指定待合并 zip 文件(至少需要一个)"
    usage
    exit 1
fi

# 合并zip文件
if [ "$print_details" = true ]; then
    echo "正在合并 zip 文件:"
    for file in "${zip_files[@]}"; do
        echo " - $file"
    done
    echo "目标 zip 文件: $target_zip"
    echo "是否合并同名文件: $merge_same_named"
    echo "打印合并详细信息..."
fi

merge_zip "$target_zip" "${zip_files[@]}"

echo "Zip 合并完成"

该脚本的工作原理如下:

  • usage 函数:打印帮助信息,显示脚本的使用方法和选项说明。
  • merge_zip 函数:实际执行 zip 文件合并的主要逻辑。它接收目标 zip 文件和待合并的 zip 文件列表作为参数。在临时目录中解压待合并的 zip 文件,并在目标目录中保存合并的文件。如果使用了 -c 选项,则将同名文件合并为一个文件,否则会对同名文件添加后缀来避免冲突。然后将目标目录的内容压缩为目标 zip 文件。
  • 解析命令行参数:使用 while 循环和 case 语句解析命令行参数。可以使用 -h--help 选项打印帮助信息。-v 选项用于启用打印详细信息的模式。-c 选项用于合并同名文件。-D 选线用于忽略文件中的目录(同名文件根据 -c 确认是否合并)。剩余的参数中,第一个参数被认为是目标 zip 文件,其他参数被视为待合并的 zip 文件。
  • 检查参数:检查是否提供了目标 zip 文件和待合并的 zip 文件。如果没有提供,将打印错误消息并显示帮助信息。
  • 打印详细信息:如果启用了打印详细信息的模式,将打印待合并的 zip 文件列表、目标 zip 文件和是否合并同名文件的状态。
  • 调用 merge_zip 函数:传递目标 zip 文件和待合并的 zip 文件列表作为参数,执行实际的 zip 合并操作。
  • 最后,打印合并完成的消息。

这个脚本允许你通过指定目标 zip 文件和待合并的 zip 文件列表,以及选择是否合并同名文件来进行 zip 文件合并。你可以根据自己的需求将其保存到 /usr/bin/zipmerge 或其他位置,并使用 zipmerge 命令来执行 zip 文件合并操作。

为了方便使用,提供 getopt 参数解析实现版本:

注意事项:
以下脚本虽然实现了文件的合并,但是实现上比较简单粗暴,只是简单地将待合并的zip文件分别解压缩到独立的目录,然后根据指定的选项对解压缩后的文件进行处理。如果待合并的zip文件的压缩率较高,且文件较大,则将占用较大的硬盘空间,存在爆盘的风险

#!/bin/bash

#### 使用示例 ####

# 此处以本脚本保存为 /usr/bin/zipmerge 为例

# 合并两个 zip 文件为一个目标 .zip 文件
# 并将同名文件合并为一个文件
# 打印合并详细信息
# 使用方法: zipmerge -v -c 目标.zip file1.zip file2.zip

# 合并三个 zip 文件为一个目标 .zip 文件
# 不合并同名文件
# 不打印合并详细信息
# 使用方法: zipmerge 目标.zip file1.zip file2.zip file3.zip

# 获取脚本开始的时间戳(毫秒)
start_time=$(date +%s%3N)

# 检查并安装命令
check_and_install_command() {
    local command_name=$1
    local package_name=$2

    # 检查命令是否存在
    if ! command -v $command_name &> /dev/null; then
        echo "未找到 $command_name 命令,正在安装..."

        # 检查操作系统类型
        if [[ "$(uname)" == "Darwin" ]]; then
            # macOS,使用 Homebrew 安装命令
            brew install $package_name
        elif [[ -x "$(command -v apt-get)" ]]; then
            # Debian/Ubuntu,使用 apt 安装命令
            sudo apt-get install $package_name -y
        elif [[ -x "$(command -v yum)" ]]; then
            # RHEL/CentOS,使用 yum 安装命令
            sudo yum install $package_name -y
        elif [[ -x "$(command -v dnf)" ]]; then
            # Fedora,使用 dnf 安装命令
            sudo dnf install $package_name -y
        else
            echo "无法自动安装 $command_name 命令,请手动安装。"
        fi
    else
        echo "$command_name 命令已安装。"
    fi
}

# 检查和安装 zip 命令
check_and_install_command "zip" "zip"

# 检查和安装 unzip 命令
check_and_install_command "unzip" "unzip"

usage() {
    echo "使用方法: $0 [选项] 目标.zip [zip文件(支持正则匹配)...]"
    echo "选项:"
    echo "  -h, --help    打印帮助信息"
    echo "  -v            打印合并详细信息"
    echo "  -c            合并同名文件为一个文件"
    echo "  -D            忽略文件中的目录(同名文件根据 -c 确认是否合并)"
}

target_zip=""
zip_files=()
merge_same_named=false
print_details=false

# 命令解析
options=$(getopt -o hvcD --long help -n "$(basename "$0")" -- "$@")
# 如果参数不合法,则打印使用说明并退出
if [ $? -ne 0 ]; then
    usage; exit
fi

# 参数解析与处理
eval set -- "${options}"

while true; do
    case "$1" in
        -h|--help)
            usage
            exit 0
            ;;
        -v)
            print_details=true
            shift
            ;;
        -c)
            merge_same_named=true
            shift
            ;;
        -D)
            ignore_directory=true
            shift
            ;;
        --)
            shift
            break
            ;;
        *)
            echo "未知选项: $1"
            usage
            exit 1
            ;;
    esac
done

# 获取目标.zip文件和待合并zip文件
target_zip=$1
shift

# 检查是否提供了目标.zip文件
if [ -z "$target_zip" ]; then
    echo "未指定目标 zip 文件"
    usage
    exit 1
fi

# 检查是否提供了 zip 文件
if [ $# -eq 0 ]; then
    echo "未指定待合并 zip 文件(至少需要一个)"
    usage
    exit 1
fi

# 合并zip文件
if [ "$print_details" = true ]; then
    echo "正在合并 zip 文件:"
    for file in "$@"; do
        echo " - $file"
    done
    echo "目标 zip 文件: $target_zip"
    echo "是否合并同名文件: $merge_same_named"
    echo "打印合并详细信息..."
fi

merge_zip() {
    local target_zip=$1
    shift

    # 创建临时目录
    local temp_dir=$(mktemp -d)
    local target_dir=$(mktemp -d)
    local counter=1

    #echo "temp_dir: $temp_dir"
    #echo "target_dir: $target_dir"

    zip_flags=""
    # 根据选项判断是否输出详细信息
    [ "$print_details" = true ] || zip_flags+="-q"

    # 解压缩并合并
    for file in "$@"; do
        unzip $zip_flags "$file" -d "$temp_dir/zip$counter"
        counter=$((counter + 1))
    done

    # 合并同名文件
    find "$temp_dir" -type f -print0 | while IFS= read -r -d '' file; do
        # 文件名解析
        filename=$(basename "$file")
        if [ "$ignore_directory" != true ]; then
            # 取临时目录后的相对路径
            filename=$(echo "$file" | sed -E "s#^${temp_dir}/zip[0-9]*/##")
        fi

        #echo "filename: $filename"
        target_file="$target_dir/$filename"

        if [ "$ignore_directory" != true ]; then
            # 提取目录信息
            directory=$(dirname "$target_file")
            # 创建目录(如果不存在)
            mkdir -p "$directory"
        fi

        if [ "$merge_same_named" = true ]; then
            # 合并文件信息
            #echo "cat $file >> $target_file"
            cat "$file" >> "$target_file"
            rm -f "$file"
        else
            # 重置重复文件计数
            counter=1
            # 对同名文件添加后缀
            while [ -e "$target_file" ]; do
                target_file="$target_dir/${filename%.*}($counter).${filename##*.}"
                counter=$((counter + 1))
            done

            #echo "mv $file $target_file"
            mv "$file" "$target_file"
        fi
    done

    # 压缩目标目录
    local target_zip_dir=$PWD
    cd $target_dir
    zip -r $zip_flags "$target_zip_dir/$target_zip" ./

    # 清理临时目录
    rm -rf "$temp_dir"
    rm -rf "$target_dir"
}

merge_zip "$target_zip" "$@"

echo "Zip 合并完成"

# 获取脚本结束的时间戳(毫秒)
end_time=$(date +%s%3N)

# 计算脚本执行时间(毫秒级)
duration=$(echo "scale=3; ($end_time - $start_time) / 1000" | bc)

# 打印处理时间
echo "脚本执行时间为:$duration 秒"

TIPS: 可以通过 zipinfo 查看 zip 文件中的所有文件

zipinfo是一个用于查看 zip 文件内容的命令行工具。它提供了有关 zip 文件中包含的文件的信息,如文件名、大小、压缩比率、日期和时间等。

使用 zipinfo 可以执行以下操作:

  • 列出 zip 文件中的所有文件: zipinfo archive.zip
  • 查看特定文件的详细信息: zipinfo archive.zip file.txt
  • 以详细格式显示 zip 文件中的所有文件信息: zipinfo -l archive.zip

zipinfo支持多种选项,用于配置其输出形式和显示结果的详细程度。一些常用选项包括:

  • -v:以详细模式显示文件信息;
  • -s:仅显示文件名;
  • -t:显示文件的压缩日期和时间;
  • -z:显示文件的压缩比率。

使用 zipinfo 可以方便地查看 zip 文件中的内容,了解其中的文件信息,以及对文件进行必要的检查和验证。

最终版

本脚本优化了峰值硬盘空间占用问题,但是整体效率相对上一个版本低。

#!/bin/bash

#### 使用示例 ####

# 此处以本脚本保存为 /usr/bin/zipmerge 为例

# 合并两个 zip 文件为一个目标 .zip 文件
# 并将同名文件合并为一个文件
# 打印合并详细信息
# 使用方法: zipmerge -v -c 目标.zip file1.zip file2.zip

# 合并三个 zip 文件为一个目标 .zip 文件
# 不合并同名文件
# 不打印合并详细信息
# 使用方法: zipmerge 目标.zip file1.zip file2.zip file3.zip

# 获取脚本开始的时间戳(毫秒)
start_time=$(date +%s%3N)

# 检查并安装命令
check_and_install_command() {
    local command_name=$1
    local package_name=$2

    # 检查命令是否存在
    if ! command -v $command_name &> /dev/null; then
        echo "未找到 $command_name 命令,正在安装..."

        # 检查操作系统类型
        if [[ "$(uname)" == "Darwin" ]]; then
            # macOS,使用 Homebrew 安装命令
            brew install $package_name
        elif [[ -x "$(command -v apt-get)" ]]; then
            # Debian/Ubuntu,使用 apt 安装命令
            sudo apt-get install $package_name -y
        elif [[ -x "$(command -v yum)" ]]; then
            # RHEL/CentOS,使用 yum 安装命令
            sudo yum install $package_name -y
        elif [[ -x "$(command -v dnf)" ]]; then
            # Fedora,使用 dnf 安装命令
            sudo dnf install $package_name -y
        else
            echo "无法自动安装 $command_name 命令,请手动安装。"
        fi
    fi
}

# 检查和安装 zip 命令
check_and_install_command "zip" "zip"

# 检查和安装 unzip 命令
check_and_install_command "unzip" "unzip"

# 检查和安装 bc 命令
check_and_install_command "bc" "bc"

usage() {
    echo "使用方法: $0 [选项] 目标.zip [zip文件(支持正则匹配)...]"
    echo "选项:"
    echo "  -h, --help    打印帮助信息"
    echo "  -v            打印合并详细信息"
    echo "  -c            合并同名文件为一个文件"
    echo "  -D            忽略文件中的目录(同名文件根据 -c 确认是否合并)"
    echo "  -p            性能模式,压缩率高的大文件合并请结合实际硬盘情况使用,有爆盘风险,性能提升 50%+,文件越多,提升越大。"
}

target_zip=""
zip_files=()
merge_same_named=false
print_details=false

# 命令解析
options=$(getopt -o hvcpD --long help -n "$(basename "$0")" -- "$@")
# 如果参数不合法,则打印使用说明并退出
if [ $? -ne 0 ]; then
    usage; exit
fi

# 参数解析与处理
eval set -- "${options}"

while true; do
    case "$1" in
        -h|--help)
            usage
            exit 0
            ;;
        -v)
            print_details=true
            shift
            ;;
        -c)
            merge_same_named=true
            shift
            ;;
        -p)
            performance_mode=true
            shift
            ;;
        -D)
            ignore_directory=true
            shift
            ;;
        --)
            shift
            break
            ;;
        *)
            echo "未知选项: $1"
            usage
            exit 1
            ;;
    esac
done

# 获取目标 zip 文件
target_zip=$1
shift

# 检查是否提供了目标 zip 文件
if [ -z "$target_zip" ]; then
    echo "未指定目标 zip 文件"
    usage
    exit 1
fi

# 检查是否提供了 zip 文件
if [ $# -eq 0 ]; then
    echo "未指定待合并 zip 文件(至少需要一个)"
    usage
    exit 1
fi

# 合并 zip 文件
if [ "$print_details" = true ]; then
    echo "正在合并 zip 文件:"
    for file in "$@"; do
        echo " - $file"
    done
    echo "目标 zip 文件: $target_zip"
    echo "是否合并同名文件: $merge_same_named"
    echo "打印合并详细信息..."
fi

# 将 target_zip 改写为绝对路径
if [[ $target_zip != /* ]]; then
  target_zip="$(readlink -f $target_zip)"
fi

# 根据选项判断是否输出详细信息
zip_flags=""
[ "$print_details" = true ] || zip_flags+="-q"

# 添加文件到目标 zip 文件中
add_file_to_zip() {
    local target_zip=$1
    local unzip_dir=$2
    local file=$3

    # 获取文件名
    filename=$(basename "$file")
    if [ "$ignore_directory" != true ]; then
        # 取临时目录后的相对路径
        filename=$(echo "$file" | sed -E "s#^${unzip_dir}/##")
    fi

    # 判断是否需要合并同名文件
    if [ "$merge_same_named" = true ]; then
        # 检查目标 zip 文件中是否存在同名文件
        if unzip -l "$target_zip" "$filename" >/dev/null 2>&1; then
            # 解压目标 zip 文件中的文件到临时文件夹
            temp_unzip_dir=$(mktemp -d)

            unzip $zip_flags "$target_zip" "$filename" -d "$temp_unzip_dir"

            target_file="$temp_unzip_dir/$filename"

            if [ "$ignore_directory" != true ]; then
                # 提取目录信息
                directory=$(dirname "$target_file")
                # 创建目录(如果不存在)
                mkdir -p "$directory"
            fi

            # 合并文件
            cat "$file" >> "$temp_unzip_dir/$filename"

            # 将合并后的文件添加到目标 zip 文件中
            cd $temp_unzip_dir
            zip -r $zip_flags "$target_zip" $filename

            # 清除临时文件夹
            rm -rf "$temp_unzip_dir"
        else
            # 将文件直接添加到目标 zip 文件中
            cd $unzip_dir
            zip -r $zip_flags "$target_zip" "$filename"
        fi
    else
        # 对同名文件添加后缀
        counter=1
        test_filename=$filename
        while unzip -l "$target_zip" "$test_filename" >/dev/null 2>&1; do
            test_filename="${filename%.*}($counter).${filename##*.}"
            counter=$((counter + 1))
        done

        if [[ $counter -gt 1 ]]; then
            mv $file $unzip_dir/$test_filename
        fi

        cd $unzip_dir
        zip -r $zip_flags "$target_zip" "$test_filename"
    fi
}

merge_zip() {
    local target_zip=$1
    shift

    # 创建临时目录
    local temp_dir=$(mktemp -d)
    local target_dir=$(mktemp -d)
    local counter=1

    zip_flags=""
    # 根据选项判断是否输出详细信息
    [ "$print_details" = true ] || zip_flags+="-q"

    # 解压缩并合并
    for file in "$@"; do
        unzip $zip_flags "$file" -d "$temp_dir/zip$counter"
        counter=$((counter + 1))
    done

    # 合并同名文件
    find "$temp_dir" -type f -print0 | while IFS= read -r -d '' file; do
        # 文件名解析
        filename=$(basename "$file")
        if [ "$ignore_directory" != true ]; then
            # 取临时目录后的相对路径
            filename=$(echo "$file" | sed -E "s#^${temp_dir}/zip[0-9]*/##")
        fi

        target_file="$target_dir/$filename"

        if [ "$ignore_directory" != true ]; then
            # 提取目录信息
            directory=$(dirname "$target_file")
            # 创建目录(如果不存在)
            mkdir -p "$directory"
        fi

        if [ "$merge_same_named" = true ]; then
            # 合并文件信息
            cat "$file" >> "$target_file"
            rm -f "$file"
        else
            # 重置重复文件计数
            counter=1
            # 对同名文件添加后缀
            while [ -e "$target_file" ]; do
                target_file="$target_dir/${filename%.*}($counter).${filename##*.}"
                counter=$((counter + 1))
            done

            mv "$file" "$target_file"
        fi
    done

    # 压缩目标目录
    cd $target_dir
    zip -r $zip_flags "$target_zip" ./

    # 清理临时目录
    rm -rf "$temp_dir"
    rm -rf "$target_dir"
}


# 合并 zip 文件
if [ "$performance_mode" = true ]; then
    merge_zip "$target_zip" "$@"
else
    # 解压缩并添加文件到目标 zip 文件中擦头
    for file in "$@"; do
        # 创建临时文件夹
        unzip_dir=$(mktemp -d)

        unzip $zip_flags "$file" -d "$unzip_dir"

        # 合并到目标 zip 文件
        find "$unzip_dir" -type f -print0 | while IFS= read -r -d '' file; do
            add_file_to_zip "$target_zip" "$unzip_dir" "$file"
        done

        # 删除缓存,释放硬盘空间
        rm -rf "$unzip_dir"
    done
fi

echo "Zip 合并完成"

# 获取脚本结束的时间戳(毫秒)
end_time=$(date +%s%3N)

# 计算脚本执行时间(毫秒级)
duration=$(echo "scale=3; ($end_time - $start_time) / 1000" | bc)

# 打印处理时间
echo "脚本执行时间为:$duration 秒"
0

评论区