前几天接手一个历史数据迁移的活儿从旧备份里翻出了一个.arj后缀的压缩包。一开始我都忘了unarj这个命令该怎么用只知道它是专门解 ARJ 格式的。折腾了一下午踩了文件名乱码、分卷缺失、umask 权限等等好几个坑。如果你也碰到老压缩包、准备迁移历史数据或者在嵌入式环境里维护存量系统这篇文章应该能帮你省下不少时间。1. 先搞明白ARJ 是什么unarj 又是什么1.1 ARJ 格式的历史与现状ARJ 是上世纪九十年代初非常流行的一种压缩格式全称是 Archived by Robert Jung作者是罗伯特·荣格。在那个软盘还是主要存储介质的年代ARJ 的压缩率比 ZIP 还要高一些而且支持多卷压缩可以把一个大文件拆成几张软盘分别存放所以当时很多 BBS、FTP 站点和个人备份都喜欢用它。后来随着磁盘价格下降、网络带宽提升ZIP、RAR、7z 这些格式逐渐把 ARJ 挤出了主流但并没有彻底消灭它。直到今天你依然可能在下面这些场景里遇到.arj文件老财务系统、老 ERP 归档的历史备份包某台嵌入式设备里的固件备份厂商当年用 ARJ 打包固件国外一些老软件分发站点的存量安装包公司内部放在磁带、光盘里的十几年前的项目资料这类文件通常数量不多但一出现就很要命主流解压工具大多能解 ZIP、RAR唯独 ARJ 经常被忽略。所以unarj虽然是个老命令在存量系统维护里依然有不可替代的位置。1.2 unarj 与 arj两个容易混淆的命令Linux 下经常有人把arj和unarj混着用其实它们的关系很微妙。arj是原版 ARJ 工具的 Linux 移植版它既能压缩也能解压功能完整。而unarj是从同一套源码里拆出来的“解压专用小工具”只负责解压不做压缩。实际发行版里arj软件包可能会同时提供arj和unarj两个命令而单独安装的unarj包则只提供后者。日常使用中解压.arj文件最顺手的就是unarj因为命令名便宜直观、依赖也少。但如果要创建 ARJ 格式压缩包或者处理损坏的多卷 ARJ 文件光靠unarj就不够可能还需要原版arj命令兜底。我后面会分别讲到。1.3 unarj 能解什么不能解什么unarj的目标很明确解开标准 ARJ 格式的压缩包。它能处理的文件包括单卷.arj文件多卷 ARJ 文件的一部分不过通常需要先手动合并某些 ARJ 衍生/相近格式但支持程度取决于版本它不能做的事也要心里有数不能创建 ARJ 文件不能修改压缩包内容不能加密压缩包对损坏文件的修复能力也有限。遇到这些情况就得借助原版arj或者其他工具。小提示如果你只是偶尔碰到一个.arj文件用 7-Zip 的 Linux 版也能解后面我会讲对比。但如果要脚本化批量处理或者老包里有分卷、变种格式unarj依然是我的首选。2. 安装 unarj不同发行版的做法和取舍unarj不是默认预装的命令很多新装系统里都找不到。好在主流发行版基本都有对应软件包安装方式不复杂。2.1 Debian / Ubuntu 系的安装方法在 Debian、Ubuntu 这类使用apt的系统上安装很简单sudo apt update sudo apt install unarj如果提示找不到unarj这个包可能是某些源的包名不一样可以试试安装完整的arj包sudo apt install arj安装完成后用which unarj确认一下路径which unarj正常情况下会输出/usr/bin/unarj。如果只装了arj包命令同样可用因为arj包内部已经包含了unarj可执行文件。2.2 RHEL / CentOS / Fedora 系的安装方法红帽系系统分两个阶段。CentOS 7、RHEL 7 这类老版本直接用sudo yum install unarj如果仓库里没有先启用 EPEL 源再执行同样的命令。CentOS 8 以上、Fedora 以及 RHEL 9 之后的系统推荐用dnfsudo dnf install unarj和 Debian 系一样如果只找到arj包直接安装arj也能获得unarj命令。安装完成以后同样可以用which unarj验证。2.3 没有包管理器时的备选方案有些精简系统、容器镜像、嵌入式环境里既没有apt也没有dnf这时候有三个备选思路下载预编译静态二进制如果厂商提供静态编译的unarj直接拷贝到/usr/local/bin下配好执行权限就能用。静态二进制几乎不依赖系统库最省事。从源码编译unarj的开源代码托管在不少开源软件站上编译依赖很少通常只需要一个 C 编译器。解压源码后执行make就能在当前目录得到unarj可执行文件。用 Docker 临时容器在容器里跑一个完整发行版镜像然后安装unarj只为了解压一次。这种方法有点重但非常干净不会污染宿主机。我自己在最小化系统上遇到过unarj缺失的情况当时的做法是找一台正常的同版本服务器把/usr/bin/unarj和它依赖的动态库一起拷贝过去。这种移植方式能不能用取决于两边系统的 glibc 版本本质上是碰运气不如静态二进制靠谱。2.4 给不同系统一个速查表系统类型推荐安装命令说明Debian / Ubuntusudo apt install unarj找不到包时用arjCentOS 7 / RHEL 7sudo yum install unarj需要 EPEL 时先装 EPELCentOS 8 / Fedorasudo dnf install unarj同样可以先试arj无包管理器静态二进制 / 源码编译依赖极少注意路径权限注意有些系统的unarj包版本很老可能不支持新的 ARJ 扩展头。绝大多数标准 ARJ 文件没问题但如果你解一个特殊变种报错第一步不是换工具而是先看版本unarj不带参数运行通常能看到版本号。3. 从列表到解压常规用法一次讲清楚unarj的命令格式其实非常传统你完全可以把它当成arj的“只看不做”版本。最常用的命令就五个l列表、v详细列表、e解压不带路径、x解压带路径、t测试完整性。3.1 查看压缩包内容而不解压拿到一个.arj文件我建议先别看都不看就解压而是先列目录确认里面到底有什么。unarj l backup.arj输出会是这样的大致结构Archive: backup.arj Files: 3 Size: 102400 Ratio: 0.56 Name Original Packed Ratio Date Time CRC -------------------------------------------------------------------------------- docs/readme.txt 10240 4096 0.40 96-01-15 10:22:34 1A2B3C4D docs/spec.pdf 92160 57344 0.62 96-01-15 10:22:40 5E6F7081 backup.sh 1024 512 0.50 96-01-15 10:22:52 90ABCDEF列表信息至少包含文件名、原始大小、压缩后大小、压缩率、日期时间以及 CRC 校验值。如果你需要看更详细的属性比如文件属性、路径等可以用v参数unarj v backup.arj这一步非常有价值。它能在你动手解压之前发现好几类问题压缩包里有没有顶层目录是不是有同名文件文件名是不是乱码大小是否正常这些问题看完整张清单再决定怎么解比解压到一半发现不对劲再来收拾要舒服得多。3.2 解压到当前目录e 与 x 的区别unarj e backup.arj和unarj x backup.arj是解压时最常用的一对命令很多人分不清。e表示 Extract会把压缩包里的所有文件解压到你当前所在的目录不保留压缩包内的目录结构。如果压缩包里有个docs/readme.txt解完之后直接在当前目录生成readme.txt。x表示 eXtract with full pathname也就是保留完整路径解压。docs/readme.txt会解压成当前目录下的docs/readme.txt。绝大多数场景下我推荐用x。因为 ARJ 文件往往是在某个老目录结构里打包的直接e解出来会把文件全部摊平一旦重名还会互相覆盖很危险。只有当你明确知道压缩包里的文件都在根目录、且不想新建目录结构时才应该用e。unarj x backup.arj3.3 只解压部分文件有时候你不需要解压整个包只想拿出其中某个文件可以使用这样的命令unarj x backup.arj docs/spec.pdf如果一次要取多个文件可以在后面继续追加文件名。如果文件名带空格记得用引号包住。需要按通配符过滤时一定要让 shell 把通配符传给unarj而不是在 shell 里展开。做法是加上引号unarj x backup.arj *.txt *.md但要注意不同版本的unarj对通配符的支持程度不一样有的版本要求文件名必须和压缩包内条目完全匹配。所以最稳妥的做法还是先用unarj l看清楚路径名再一条一条指定。3.4 解压到指定目录最实用的技巧很多人会习惯性地找-C参数像tar -C那样指定解压目录。但unarj的老版本并没有统一的-C选项不同发行版编译的版本行为还不一致。与其纠结参数不如老老实实先切换目录mkdir -p ~/restore/backup cd ~/restore/backup unarj x /path/to/backup.arj这样解压结果一定会出现在~/restore/backup下而且不会因为目标目录不存在而报错。如果你确实想让命令更简洁可以在 subshell 里执行mkdir -p ~/restore/backup (cd ~/restore/backup unarj x /path/to/backup.arj)这种写法在脚本里也非常好用因为cd不会影响脚本本身的当前目录。3.5 解压前先测试完整性老压缩包经过这么多年磁道损坏、下载不完整、拷贝过程中丢字节都是常事。解压之前先用t参数测试一下unarj t backup.arjt会遍历压缩包内所有条目重新计算 CRC 校验值并和压缩包内记录的值比对。如果输出里有任何一行显示校验错误说明这个文件已经损坏直接解压大概率也会失败。我的习惯是unarj l看清单unarj t测完整性两步都没问题才unarj x解压。老压缩包数量少但体积往往不大多花几秒钟做检查能省掉很多后续对账的麻烦。4. 多卷 ARJ 包的识别与合并老式 ARJ 最让人头疼的还不是单文件解压而是多卷压缩包。当年为了把大文件放进软盘ARJ 会把压缩包切成若干个卷放盘时按顺序依次拷贝用的时候再按顺序读盘。4.1 多卷 ARJ 的命名规则一个典型的多卷 ARJ 包通常长这样backup.arj backup.a01 backup.a02 backup.a03其中backup.arj是第一卷后面的.a01、.a02依次是后续卷。也有个别工具使用.000、.001这类后缀但最常见的就是.arj.aNN。如果你只有其中一个卷比如只有backup.a02那是没办法直接解压的。因为多卷包要从第一卷开始按顺序读取所有分卷内容。4.2 用 cat 合并后再解压在 Linux 下处理多卷 ARJ最常见的思路是把所有分卷按顺序拼接成一个完整文件然后再用unarj解压cat backup.arj backup.a01 backup.a02 backup.a03 merged.arj unarj x merged.arj这个操作的本质是把多个分卷文件在字节层面合并成一个连续文件。ARJ 分卷本身就是把一个完整压缩流切开所以大多数情况下这种cat拼接是有效的。但需要注意几点顺序不能错。一旦把backup.a02放到backup.a01前面解压必然失败。合并前检查文件类型。用file backup.a01确认每个分卷都是 ARJ 数据的一部分避免混进来一个无关文件。拼接后用unarj t测试。如果测试通过就可以放心解压如果测试报错说明中间某个卷缺失或损坏。4.3 为什么 unarj 对多卷包不友好严格来说unarj本身并没有提供特别优雅的多卷处理能力。老版 ARJ 工具在解压多卷包时会提示你“插入下一张盘”是交互式处理的思路。到了 Linux 环境下这种交互提示不适合脚本化所以大家更习惯先把分卷合并成单文件。如果你用unarj直接解压backup.arj而它本身是多卷包的第一卷很可能只解出属于第一卷的文件然后在某个位置报“需要下一卷”。这时候不要怀疑压缩包坏了先按上面的方法合并分卷再解。实际操作中我还遇到过一种罕见情况某个分卷本身是完整备份的一部分扩展名却是.arj导致我以为它是独立压缩包。这种问题只有一项一项用file命令检查才知道不能光看后缀。5. 解压现场最容易翻车的问题我在处理那批历史备份时真正卡住我的不是命令本身而是各种边界情况。下面这几个问题几乎每次遇到 ARJ 文件时都可能碰上。5.1 文件名乱码GBK 编码与 UTF-8 的冲突老 ARJ 包大多是在中文 Windows、DOS 或某些国产系统里压缩的文件名编码往往是 GBK 或 GB18030。而现代 Linux 终端默认使用 UTF-8于是你用unarj l看的时候中文文件名会显示成一堆乱码解压出来的文件名同样乱。比如压缩包里的项目说明.txt在你的终端里可能显示成椤圭洺璇存槑.txt这种天书。解决办法是解压后用convmv把文件名从 GBK 转成 UTF-8sudo apt install convmv # 安装工具 convmv -f GBK -t UTF-8 --notest -r .这条命令的含义是把当前目录下所有文件名从 GBK 编码转成 UTF-8-r递归处理子目录--notest表示真正执行重命名而不是只预览。不加--notest的话convmv只会显示“将要做什么”不会实际改动文件名。再说细一点如果压缩包内部文件的内容本身也是 GBK 编码文本转完文件名之后读取文件内容时可能还需要转码。比如用file命令看到一个文本文件是ISO-8859或GBK可以用iconv转iconv -f GBK -t UTF-8 项目说明.txt 项目说明_utf8.txt这个操作是内容转码和文件名字符集是两码事不要混淆。5.2 报错 “Not a valid ARJ file” 的完整排查思路解压时报Not a valid ARJ file不代表这个文件一定没救了。我见过下面四种情况第一种是文件类型根本不是 ARJ。有些人会把.rar、.zip甚至.gz文件改名成.arj。先用file命令看真实类型file archive.arj如果输出显示bzip2 compressed data、Zip archive data之类说明扩展名是错的直接用对应的正确工具解压即可。第二种是分卷包不完整。多卷包如果缺了后续分卷合并后的文件就不完整unarj会在头部之后某个位置判断失败。这时要重新核对所有分卷是否齐全。第三种是文件头损坏或偏移。ARJ 压缩包的标准签名通常以十六进制的60 EA开头你可以用hexdump查看前几个字节hexdump -C -n 16 archive.arj如果开头不是60 EA那么这个文件要么不是 ARJ要么头部已经损坏。第四种是下载或拷贝时导致文件截断。文件大小明显比预期小或者unarj l能列出文件但unarj t报 CRC 错误基本就是截断或损坏。这种只能重新获取原始文件。5.3 权限、属主和 umask 的坑在 Linux 下解压文件权限不会凭空从 ARJ 包里完美恢复。unarj解压出来的文件权限通常受当前用户umask影响如果解压操作是用 root 做的文件属主就是 root后续普通用户可能无法修改。比如你在/root/下解压然后想把这些文件交给普通用户处理就会发现文件删除不了、改不动。更稳妥的做法是用一个普通用户账号在专门的工作目录下解压必要时先umask 022保证组内用户有读权限解压后用find调整权限find . -type f -exec chmod 644 {} \; find . -type d -exec chmod 755 {} \;这不是unarj的问题而是 Unix 文件权限模型的正常表现。但初次使用的人很容易忽略以为解压完就一定是可读可写的。5.4 同名文件和大小写敏感冲突ARJ 时代很多包是在 Windows 下做的Windows 文件名大小写不敏感所以压缩包里可能同时存在File.txt和file.txt。在 Linux 下解压到同一个目录这两个文件会被看成两个不同文件虽然技术上没报错但很容易让人误会成同一文件的不同版本。还有更极端的某些打包工具会在压缩包内记录一个Readme.txt和一个README.TXT在 Linux 下同时解出来后续人工比对非常痛苦。建议解压前用unarj l检查有没有近似重复的名字如果发现大量大小写重复考虑用unarj e只解必要文件或者把不同文件分散到不同目录。6. 批量解压脚本与更顺手的替代工具单文件手动解压没问题但当你拿到上百个 ARJ 包时就得考虑批量处理了。6.1 按文件名自动建目录的批量脚本我实际用的一个批量解压脚本长这样#!/bin/bash for arj in *.arj; do [ -f $arj ] || continue dir${arj%.arj} mkdir -p $dir ( cd $dir unarj x ../$arj /dev/null 21 ) echo 已解压: $arj done这段脚本的逻辑是遍历当前目录下所有.arj文件以压缩包文件名去掉后缀作为目录名创建目录后进入该目录再解压外层路径的压缩包。这样每个 ARJ 包的内容都独立放在一个目录里不会混在一起。如果你确定压缩包内部已经自带顶层目录也可以简化成for arj in *.arj; do unarj x $arj done这种直接解到当前目录的方式适合“每个包都是一个项目根目录”的情况。拿不准的话先用unarj l看看第一个包的结构再决定。6.2 备选工具7z 和 bsdtar除了unarjLinux 下还有两个常用工具能解 ARJ7-Zip 的命令行版7z7z x backup.arjlibarchive 提供的bsdtarbsdtar -xf backup.arj这两个工具的优势在于“通用”它们能识别很多压缩格式遇到不确定的包可以先用它们试一把。但劣势也明显兼容性不如原版unarj对 ARJ 变种的支持到位多卷处理能力也参差不齐。我自己遇到过一个带加密头的 ARJ 变种包7z直接报不支持unarj反而能正常列出内容。反过来某些现代系统上unarj版本太旧解不了新一点的 ARJ 扩展标记7z却能正常处理。所以两个工具都装好才是稳妥方案。6.3 工具选型建议场景推荐工具原因标准单卷 ARJ 包unarj或7z都很快看个人习惯多卷 ARJ 包先手动合并再用unarj兼容性最接近原版文件名全乱码unarj解压 convmv转码流程可控损坏文件/变种包原版arj工具兜底功能最完整批量脚本解压unarj命令简单依赖少我曾经为了验证一个十几年前的 ARJ 包先后试了7z、unarj、bsdtar最后是原版arj工具靠一个不常用的交互选项成功读出内容。那次之后我就养成了习惯基础包用unarj遇到问题再挨个升级工具而不是一开始就上最全的。实际处理那批历史备份时我的最终流程是先用file判断所有待解压文件的真实类型再用unarj l看清单确认没有异常后统一用脚本解压到独立目录最后用convmv处理乱码文件名。这套流程下来几十个老压缩包基本一次搞定。尤其是文件名乱码这条如果没有提前处理后续按文件名归档、检索、对账都会非常难受。希望这篇实战笔记能让你下次见到.arj文件时少一点焦虑多一点把握。
阅读完成 · 觉得有帮助?