【Linux】使用Bash和GNU Parallel并行解压缩文件

介绍

在本教程中,我们将学习如何使用Bash脚本和GNU Parallel实现高效并行解压缩多个文件。这种方法在处理大量文件时可以显著加快提取过程。

先决条件

确保系统上已安装以下内容:

  • Bash
  • GNU Parallel

你可以使用以下命令在不同Linux系统上安装它们:

在Ubuntu上安装

bash 复制代码
# 安装Bash(通常已经安装)
sudo apt-get update
sudo apt-get install bash

# 安装GNU Parallel
sudo apt-get install parallel

在CentOS上安装

bash 复制代码
# 安装Bash(通常已经安装)
sudo yum install bash

# 安装GNU Parallel
sudo yum install parallel

场景

想象一下,您有一个包含多个ZIP文件的目录,并且希望并行提取它们以节省时间。我们将创建一个Bash脚本,使用GNU Parallel实现此目标。

Bash脚本

让我们逐步分解脚本:

bash 复制代码
#!/bin/bash

# 切换到指定目录,通过命令行参数传递
cd "$1" || exit

# 获取当前目录下所有zip文件
zip_files=$(ls *.zip)

# 定义解压函数
unzip_file() {
  zip_file="$1"
  # 解压zip文件到新创建的目录
  unzip "$zip_file"
}

# 设置并发线程数,可以根据需要调整
num_threads=12

# 导出解压函数,使其可在子shell中调用
export -f unzip_file

# 利用parallel执行解压函数
echo "$zip_files" | parallel -j "$num_threads" unzip_file

解释:

  • 切换目录: 脚本首先通过命令行参数切换到指定目录,这样您就可以选择要处理的目标目录。

  • 列出ZIP文件: 使用ls获取当前目录中所有ZIP文件的列表。

  • 解压函数: 定义unzip_file函数,用于使用unzip命令提取给定的ZIP文件。

  • 设置线程数: 您可以调整num_threads变量以控制并行线程的数量。

  • 导出函数: 使用export -f unzip_file命令导出unzip_file函数,以便在子shell中使用。

  • 并行执行: 最后,使用parallel命令以并行方式对每个ZIP文件执行unzip_file函数。

运行脚本

  1. 将脚本保存为文件,例如parallel_unzip.sh
  2. 使脚本可执行:chmod +x parallel_unzip.sh
  3. 运行脚本:./parallel_unzip.sh <目标目录>

实验

这里,咱们做一个实验,来对比一下并行和不并行的时间。样例输入是一个包含10个压缩包的文件目录,每个压缩包里面都有1000张待解压的图片。实测数据如下:

线程数 运行时间 (s)
10 4.108
5 7.763
2 18.293
1 36.077

结论

通过利用Bash脚本和GNU Parallel,您可以在并行中高效地解压缩多个文件,优化提取过程并节省时间。这种方法在处理大量归档文件时尤为有益。根据您的具体需求自定义脚本,并享受在文件提取任务中并行处理的好处!

相关推荐
Abladol-aj1 小时前
并发和并行的基础知识
java·linux·windows
JunLan~5 小时前
Rocky Linux 系统安装/部署 Docker
linux·docker·容器
方竞6 小时前
Linux空口抓包方法
linux·空口抓包
海岛日记7 小时前
centos一键卸载docker脚本
linux·docker·centos
AttackingLin8 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
学Linux的语莫9 小时前
Ansible使用简介和基础使用
linux·运维·服务器·nginx·云计算·ansible
踏雪Vernon9 小时前
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
linux·docker·容器·harmonyos
学Linux的语莫10 小时前
搭建服务器VPN,Linux客户端连接WireGuard,Windows客户端连接WireGuard
linux·运维·服务器
legend_jz10 小时前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法