extract 并不是一个标准的、系统自带的命令(ls, cp, mv 那样),它通常是一个用户自定义的Shell脚本,目的是为了简化从不同类型的压缩文件中解压内容的过程。

没有这个脚本时,我们解压不同格式的文件需要使用不同的命令:
.tar文件:tar -xvf filename.tar.tar.gz或.tgz文件:tar -xzvf filename.tar.gz.tar.bz2文件:tar -xjvf filename.tar.bz2.tar.xz文件:tar -xJvf filename.tar.xz.zip文件:unzip filename.zip.rar文件:unrar x filename.rar.7z文件:7z x filename.7z
这很繁琐,而 extract 脚本的作用就是,你只需要输入 extract filename,它会自动根据文件的后缀名,调用正确的解压命令。
extract 脚本是什么?
它是一个用 Shell(通常是 Bash)编写的脚本,内部使用 case 语句来判断文件的扩展名,并执行相应的解压命令。
如何安装和使用 extract 脚本?
安装和使用非常简单,通常只需要几步。

第一步:获取 extract 脚本内容
你可以从网上找到很多版本的 extract 脚本,这里提供一个非常流行和完整的版本,将它保存到一个文件中。
# 创建一个名为 extract 的文件 touch extract # 用你喜欢的编辑器打开它,nano nano extract
粘贴到文件中:
#!/bin/bash
# extract - a simple script to extract multiple file types.
# Check if a file was provided as an argument
if [ -z "$1" ]; then
echo "Usage: extract <filename>"
echo "Extracts tar, tar.gz, tar.bz2, tar.xz, zip, rar, 7z, and more."
exit 1
fi
# Check if the file exists
if [ ! -f "$1" ]; then
echo "Error: File '$1' not found."
exit 1
fi
# Extract based on file extension
case "$1" in
*.tar.bz2) tar xjf "$1" ;;
*.tar.gz) tar xzf "$1" ;;
*.tar.xz) tar xJf "$1" ;;
*.tar) tar xf "$1" ;;
*.tbz2) tar xjf "$1" ;;
*.tgz) tar xzf "$1" ;;
*.bz2) bunzip2 "$1" ;;
*.rar) unrar x "$1" ;;
*.gz) gunzip "$1" ;;
*.zip) unzip "$1" ;;
*.Z) uncompress "$1" ;;
*.7z) 7z x "$1" ;;
*.deb) ar x "$1" ;;
*) echo "Error: '$1' cannot be extracted with extract."
echo "Supported formats: tar.bz2, tar.gz, tar.xz, tar, tbz2, tgz, bz2, rar, gz, zip, Z, 7z, deb."
exit 1 ;;
esac
echo "Extraction of '$1' complete."
第二步:赋予执行权限
为了让这个脚本可以像命令一样运行,你需要给它添加可执行权限。
chmod +x extract
第三步:将脚本移动到系统 PATH 中
为了让你在任何目录下都能直接使用 extract 命令,需要把这个脚本放到一个系统 PATH 环境变量包含的目录中。~/bin(用户主目录下的 bin 目录)是最佳选择,因为它不需要 sudo 权限。

- 创建
~/bin目录(如果不存在)mkdir -p ~/bin
- 移动脚本到
~/binmv extract ~/bin/
- 确保
~/bin在你的PATH中 大多数现代 Linux 发行版(如 Ubuntu, macOS)会自动将~/bin添加到PATH,你可以通过以下命令检查:echo $PATH
如果输出中包含了
/home/你的用户名/bin(或~/bin的绝对路径),那就没问题了,如果没有,你需要将下面这行代码添加到你的 Shell 配置文件中(如~/.bashrc,~/.zshrc等):export PATH="$HOME/bin:$PATH"
添加后,运行
source ~/.bashrc(或source ~/.zshrc) 使其生效。
第四步:使用 extract 命令
你可以在任何地方使用 extract 命令了!
# 假设你有一个名为 my_project.tar.gz 的压缩包 extract my_project.tar.gz # 它会自动识别并执行 tar -xzf my_project.tar.gz
extract 脚本的工作原理(代码解析)
让我们分解一下上面那个脚本的核心部分:
#!/bin/bash
...
# "$1" 是你通过命令行传递给脚本的第一个参数,也就是文件名
case "$1" in
# 如果文件名以 .tar.bz2
*.tar.bz2) tar xjf "$1" ;;
# 如果文件名以 .tar.gz
*.tar.gz) tar xzf "$1" ;;
# ... 其他格式匹配
*) echo "Error: '$1' cannot be extracted with extract."
exit 1 ;;
esac
#!/bin/bash: 这是 "Shebang",告诉系统这个脚本应该用 Bash 解释器来执行。if [ -z "$1" ]: 检查第一个参数"$1"是否为空,如果是,就显示用法提示并退出。if [ ! -f "$1" ]: 检查第一个参数指向的文件是否存在,如果不存在,就报错并退出。case "$1" in ... esac: 这是核心的case语句,它会检查变量"$1"(即你的文件名)的值。*.tar.bz2) tar xjf "$1" ;;: 这是case的一个分支。*.tar.bz2)是一个模式匹配,意思是“以字符串.tar.bz2。tar xjf "$1"是要执行的命令。x代表 extract(解压),j代表处理bzip2格式,f代表指定文件名("$1")。- 表示
case分支的结束。
- 这是一个通配符,代表所有前面没有匹配到的情况,如果文件后缀不在脚本的支持列表中,就会执行这里的代码,打印错误信息并退出。
其他相关工具
除了自己写 extract 脚本,还有一些现成的工具可以实现类似甚至更强大的功能。
a. atool
atool 是一个专门用于处理归档文件的工具,集成了创建、列表和提取功能,功能比简单的 extract 脚本更丰富。
安装:
# Debian/Ubuntu sudo apt-get install atool # Fedora/CentOS sudo dnf install atool
使用:
# 提取文件 (会自动识别格式) aunpack my_archive.zip # 列出归档内容 als my_archive.tar.gz # 创建归档 apack my_archive.zip file1.txt file2.txt
b. dtrx
dtrx (Do The Right eXtraction) 是一个非常智能的提取工具,它不仅能自动识别格式,还能处理嵌套的压缩包(一个 .tar.gz 文件里面又有一个 .zip 文件),并且会自动创建与文件同名的目录来存放解压内容,避免当前目录变得杂乱。
安装:
# Debian/Ubuntu sudo apt-get install dtrx # Fedora/CentOS sudo dnf install dtrx
使用:
# 提取文件,非常简单! dtrx my_complex_archive.tar.gz
| 方法 | 优点 | 缺点 | 适合人群 |
|---|---|---|---|
自定义 extract 脚本 |
- 轻量级,无依赖 - 完全自定义,可扩展 |
- 需要自己创建和维护 - 功能相对简单 |
喜欢DIY、追求极简环境的用户 |
atool |
- 功能全面(增删查改) - 命令统一,易记 |
- 需要额外安装一个包 | 需要一个简单归档管理工具的用户 |
dtrx |
- 极其智能,能处理复杂情况 - 自动创建目录,干净整洁 - 命令极其简单 |
- 需要额外安装一个包 | 所有用户,特别是经常处理各种压缩包的用户 |
对于大多数用户来说,强烈推荐直接使用 dtrx,因为它能解决你几乎所有关于解压的烦恼,如果你只是想体验一下 Shell 脚本的乐趣,或者不想安装新软件,那么自己写一个 extract 脚本也是非常好的实践。
