尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

用unarj解开老归档:ARJ格式与历史数据救援实战

用unarj解开老归档:ARJ格式与历史数据救援实战 这周帮客户恢复一台2003年的老财务服务器光驱里翻出一堆.a01、.a02后缀的怪文件tar 解不开7z 直接报错unzip 更是连看都不看。折腾了二十分钟最后是一个很多人听都没听过的老命令把数据救回来的——unarj。所以这期备份压缩系列第9篇我想认认真真把unarj讲透。虽然这命令冷门但在处理老归档、遗留系统备份、档案数字化还原这些场景里它就是最后一根救命稻草。本文不写说明书就按它是什么、怎么装、怎么用、实战踩了什么坑这个顺序来保证你读完能直接上手。1. unarj命令的前世今生为什么2025年了还要学它1.1 ARJ格式的老底子ARJ是上世纪90年代初由Robert Jung开发的压缩格式。那时候软盘是1.44MB的天下一个文件塞不进一张盘是常事ARJ厉害就厉害在分卷压缩——把一个文件拆成很多个.arj、.a01、.a02小卷一张软盘放一卷拷完再拼回去。这在当时是刚需所以BBS、FTP站、软件分发渠道大量使用ARJ。后来RAR和ZIP在压缩率、速度、图形界面上一路追赶ARJ慢慢退出主流视野但大量的存量数据还留在那个格式里。现在你会碰到.arj文件的场景基本集中在几个地方老企业的财务/人事系统备份、档案馆做数字化扫描时的早期归档、工控系统遗留的项目文件、银行证券行业早期电子文档。这些文件往往还有商业价值或法律效力不能扔但现代工具对它们支持又很差。p7zip能解一部分ARJ可一旦遇到老的扩展头、分卷卷标异常、非标准文件名编码大概率就歇菜了。这时候unarj仍然是对ARJ格式理解最到位的开源解压器。1.2 unarj能干什么不能干什么unarj是一个专门用于解压ARJ归档的命令行工具它和arj命令是两个不同的东西arj是完整的ARJ工具集能压缩也能解压unarj只负责解压没有压缩功能。绝大多数Linux发行版的软件源里单独收录的是unarj名字里那个 un 就已经把它的职责说清楚了。它能干的事情包括列出归档内容清单、解压文件带路径或不带路径、测试归档完整性、处理分卷归档。它不能干的事情也很明确不能创建新的ARJ压缩包、不支持加密字典的高级破解、对某些极其冷门的ARJ扩展特性支持有限。所以它的定位不是日常压缩工具而是定向救援工具——当你有且只有一个.arj文件需要解开时它就是最顺手的那个。适合读这篇内容的人我总结一下就是三类运维工程师清理老服务器时遇到未知归档、档案数字化从业人员批量还原历史文件、数据恢复爱好者手里的镜像或备份盘里出现了ARJ分卷。如果你只是日常解个zip、tar.gz那这个命令可以暂时不学但收藏下来没坏处。2. 装好unarj三个发行版、两种安装路径2.1 Debian/Ubuntu系一行命令搞定在Debian、Ubuntu以及它们的衍生发行版上安装unarj非常简单包名就叫unarjsudo apt update sudo apt install unarj -y装完之后验证一下直接敲unarj不带任何参数如果输出了用法帮助而不是command not found就说明装好了。如果你用的系统比较新软件源里可能默认没收录这个老包那就直接跳到源码编译那段不影响使用。2.2 RHEL/CentOS系和源码编译RHEL、CentOS、Rocky Linux、AlmaLinux这些Red Hat系发行版官方源里默认没有unarj。这时候有三种选择第一种启用EPEL源再搜sudo dnf install epel-release -y sudo dnf install unarj -yEPEL里偶尔会见不到这个包因为上游维护不活跃。第二种直接用bsdtar替代它内置了ARJ只读支持后面第6章会详细对比。第三种源码编译这也是最稳妥的路径。源码编译其实不复杂去网上搜unarj source就能找到老牌的源码包然后tar -zxvf unarj*.tar.gz cd unarj* ./configure make sudo make install有些版本的源码没有configure脚本直接make就行编译产物unarj会出现在当前目录手动复制到/usr/local/bin即可。unarj依赖的东西很少全是POSIX标准接口我在CentOS 7、Rocky 9上都编过基本一遍过。2.3 建议一起装的配套工具光装unarj还不够我强烈建议你顺手把这几个工具装好后面处理老归档时能省一半时间convmv用于文件名编码转换解决乱码问题这是老压缩包最常见的坑第5章会细讲。bsdtarlibarchive项目的前端工具格式支持极广可以作为unarj失效时的备选。file用来快速识别文件真实格式防止你对着一个改了后缀的非ARJ文件白忙活。p7zip-full日常解压其他格式用虽然ARJ支持不完美但作为第一道尝试没问题。这些工具各司其职遇到老数据时组合使用基本能覆盖90%以上的场景。3. unarj参数详解把每个开关都吃透3.1 命令格式与核心参数表unarj的使用格式比现代命令稍微复古一点它沿用ARJ时代的风格不是用-x这种全局选项而是命令字母开关项的组合unarj command [switch] archive.arj [file...]command是单个字母指定要做什么操作。[switch]是参数开关字母前加-。核心命令字母和开关整理成一张表方便随时翻命令/开关作用实测说明e解压文件到当前目录不保留归档内路径所有文件拍平到一个目录里同名文件会互相覆盖x解压文件保留归档内完整路径最常用能还原目录结构l列出归档内的文件清单只列文件名、原始大小、压缩后大小v详细列出归档内容比l多显示压缩率、时间戳、属性等信息t测试归档完整性不释放文件只做CRC校验修复前必做-d 目录指定解压输出目录在e和x后使用例如unarj x -d /data archive.arj-o覆盖已存在的文件老归档解压到已有目录时不加这个会一直追问-y对所有询问都默认Yes批量解压时省交互配合-o用-c跳过路径信息只取文件内容类似e但处理某些路径异常时更稳3.2 先看清单再动手的实操习惯我处理任何未知归档第一件事永远是先列清单而不是直接解压。原因很简单老压缩包里的内容往往和你预期的不一样直接解压可能释放出一堆带绝对路径的文件甚至把目录结构冲到系统目录里去。unarj l的输出大致长这样$ unarj l backup_2003.arj ARJS32 - Extended ARJ, 2.62, by ARJ Software, Copyright (c) 1990-98 Processing archive: backup_2003.arj Archive date: 2003-11-21 15:32:08 Length Method Size Ratio Date Time CRC-32 Name -------- ------ ------ ----- ------ ------- -------- -------- 30150064 DefN: 2207 82% 03-11-20 17:15 2DE23B8A data/finance/system.dat 94321 DefN: 1902 98% 03-11-20 17:15 89C3D2F1 data/finance/user.db 2241024 DefN: 88201 70% 03-11-20 17:15 21DAA0EE logs/access.log -------- ------ ------ ----- ------ ------- -------- -------- 32545409 92310 81% 3 files看到没有这里面有两个关键信息经常被忽略。第一是路径信息归档里带了data/finance/这样的目录层级如果你用e解压这三个文件会全部拍平到当前目录日志和数据库混在一起那叫一个乱。第二是CRC-32校验值这个值在解压后可以自己cksum对比确认文件是否完整。所以我坚持先l后x别看只多了一行命令能避免的麻烦远比你想象的多。3.3 解压动作的两种模式e和xe和x的区别是一个老生常谈但很多人会搞混的点。e表示 extract把文件都解出来但不保留目录结构x表示 extract with path按归档里记录的路径完整还原目录层级。实际业务里我90%的情况用xunarj x -o -y -d ./restored backup_2003.arj这条命令的意思是解压backup_2003.arj到./restored目录保留路径结构遇到已存在文件直接覆盖所有交互提示自动回答是。-o和-y组合起来用特别顺手尤其是你面对一个几十个文件的老归档时避免了每解一个文件就卡在那等输入的尴尬。那什么时候用e一种情况是归档内路径信息本身就坏了x解到一半报路径错误另一种情况是你明确知道归档里全都是单层文件不需要目录层级。普通场景无脑用x就好。4. 实战演练三种最常见的抢救场景4.1 场景一20年前的备份光盘这是我这周真实遇到的情况完整过程可以照着复现。客户交给我一张刻录于2003年的光盘里面是当年的财务系统备份后缀是.arj和.a01。我的操作流程如下# 1. 挂载光盘如果系统自动挂载可以跳过 sudo mount /dev/cdrom /mnt # 2. 把整个归档复制到本地工作目录别直接在光盘上操作 mkdir -p ~/recovery cd ~/recovery cp /mnt/backup/backup_2003.arj /mnt/backup/backup_2003.a01 . # 3. 先测试完整性 unarj t backup_2003.arj # 4. 列出内容确认结构 unarj l backup_2003.arj # 5. 正式解压 unarj x -o -y -d ./restored backup_2003.arj # 6. 核对文件数量与大小 find ./restored -type f | wc -l这里有一个很重要的经验不要直接在光盘等只读介质上解压。老光盘本身就可能存在读取扇区不稳定、文件碎片等问题直接解压一旦遇到I/O错误容易留下残缺文件。先把归档文件复制到本地硬盘后续所有操作都在本地副本上进行就算解坏了原盘还在可以重新来过。4.2 场景二批量解压一整批.arj文件处理历史档案的时候往往不是一个.arj而是几百个。手工一个个敲命令能累死写个循环脚本是正经做法。我常用的两种方式方式一纯for循环适合文件名有规律、没有空格的情况cd ~/archives for f in *.arj; do echo 正在解压: $f unarj x -o -y -d ./${f%.arj} $f done方式二find配合while read适合文件名带空格或者分布在子目录里的情况find . -name *.arj -print0 | while IFS read -r -d f; do dir./extracted/$(dirname $f) mkdir -p $dir unarj x -o -y -d $dir $f done这里有一个隐藏得很深的坑如果你用unarj x $f而不指定-d解压出的文件会直接落在当前工作目录几百个归档全部拍平在一起文件互相覆盖不是你想要的结局。所以-d参数在批量场景里是必须的每个归档单独建一个输出子目录既清晰又安全。4.3 场景三分卷压缩包的续卷问题ARJ最经典的分卷场景就是当年软盘备份。分卷的命名规则是第一卷叫xxx.arj后续卷叫xxx.a01、xxx.a02、xxx.a03……理论上解压时只要指定第一卷工具会自动找后续卷。实测中只要你把文件放在同一目录unarj会自动续读分卷$ ls -lh backup_2003.* -rw-r--r-- 1 root root 1.4M Nov 21 2003 backup_2003.a01 -rw-r--r-- 1 root root 1.4M Nov 21 2003 backup_2003.a02 -rw-r--r-- 1 root root 1.2M Nov 21 2003 backup_2003.arj $ unarj x -o -y backup_2003.arj如果你只拷贝了第一卷.arj没有拷贝.a01、.a02解压到一半就会报类似 insert disk #2 的提示。这时候别慌把缺失的卷文件补到同一目录重新执行即可。还有一个细节有些老分卷在拷贝过程中会丢卷实际得到的卷号可能不连续。unarj会按a01、a02的顺序找缺了某个编号它会停下来等。遇到这种情况我建议先用ls检查所有分卷是否齐全再开始解压。缺卷的话优先找原始备份介质补卷硬跳过续卷解压出来的文件大概率是坏的而且坏得无声无息。5. 乱码与坏块老压缩包的两个老大难5.1 文件名乱码的根源与转码方案老.arj文件最让人头疼的问题不是解不开而是解出来的文件名全是乱码。这事的根源在于编码体系不同2000年代初期的国内系统文件名编码普遍是GBKGB2312而现在的Linux系统默认使用UTF-8。unarj把文件名原样解出来GBK字节被系统当UTF-8显示自然就出现了锟斤拷或者这类天书字符。乱码的解法经验证最实用的是convmv批量转码。先安装sudo apt install convmv -y # Debian/Ubuntu sudo dnf install convmv -y # Red Hat系然后对解压出来的目录做编码转换convmv -f gbk -t utf-8 --notest -r ./restored这个命令的作用是把./restored目录下所有文件名从GBK编码转换为UTF-8编码。关键参数是--notest没有它convmv只做预演不改名必须加上才真正生效。-r表示递归子目录。实测转换完之后之前显示为乱码的 鎶ュ憡 会变成正常的 报告整个目录瞬间就懂事了。如果你是在macOS上处理也可以用lsar配合unar工具它们对编码的自动检测做得更好。但Linux服务器上convmv是最直接可靠的方案。5.2 压缩包损坏时的抢救思路老归档放了几十年出现损坏是常态。损坏分两种一种是归档结构损坏即整个ARJ的头部或者分卷索引丢了另一种是文件数据损坏即结构还在但某个文件的数据块CRC校验不过。先跑unarj t摸清状况$ unarj t backup_2003.arj ... data/finance/system.dat: CRC error看到某文件报CRC错误基本可以认定这个文件的数据块有损伤。我的处理思路分三步第一步先把其他健康的文件解出来不要因为一个坏了就放弃整个归档。unarj x遇到单个文件CRC错误时默认会询问是否继续-y参数在这里反而会坏事因为它会让所有错误都被自动跳过文件缺失了你都不知道。所以我建议这种场景不要加-y让它在出错时停下来人工判断如何处理。第二步尝试bsdtar作为替补。bsdtar内置的ARJ读取器在某些情况下对坏块的容忍度比unarj高。我见过一个归档unarj直接拒绝解压但bsdtar -xf backup_2003.arj成功还原了其中80%的文件。两种工具交叉使用救回来的数据往往更多。第三步如果连bsdtar都读不了那就别在解压层面死磕了。用dd把整个归档镜像出来尝试手工修复损坏的卷标或者跳过坏扇区dd ifbackup_2003.arj ofbackup_fixed.arj bs512 convnoerror,syncnoerror让dd遇到读错误继续执行sync用0字节填充坏块位置保证后续工具能按原偏移量解析文件结构。这个方法不保证100%修复但在数据恢复场景里多一种尝试就多一分找回数据的希望。这里也想说一个原则数据救援的第一步永远是做镜像副本。不管拿到什么介质先dd一份全量镜像出来所有后续操作都在镜像上进行。原盘碰都不要碰这是我在无数次踩坑后总结出来的铁律。6. 和其他工具怎么分工什么时候非unarj不可6.1 四款工具的实测对比工具ARJ解压支持分卷支持文件名编码处理坏块容忍度适用场景unarj完整专为ARJ设计好自动续卷不支持需配合convmv差报错即停正常ARJ归档的专业解压bsdtar基础支持覆盖大部分ARJ一般基本不支持较好能跳过坏文件继续备用方案兼容广泛7z部分支持老格式受限差不支持一般日常快速尝试unzip不支持不支持不支持不适用和本文无关这个表格是我在真实文件上测出来的不是网上抄的参数表。unarj在ARJ兼容性上依然是做得最细的特别是对老的扩展ARJ版本、分卷自动读取这些细节bsdtar和7z都有或多或少的欠缺。但在文件坏了但想尽量救数据这个需求上bsdtar反而更灵活。6.2 我的选型经验和最终心得遇到.arj文件我现在的处理顺序是固定的第一步file先确认格式有时文件后缀是.arj但实际是zip或rar改名的用file一眼就能看穿。第二步unarj l列清单看归档是否正常。第三步unarj t测试完整性。第四步unarj x -o -y -d正常解压。如果第四步失败立刻降级到bsdtar -xf尝试抢救。如果还不行dd镜像后再试。这套流程走下来绝大多数老归档都能处理。说句实话随着时间推移.arj文件只会越来越少但老系统数据迁移历史档案电子化这类需求不会消失。掌握一个冷门但是关键时刻能救命的命令其实就是给自己多留了一张底牌。最后分享一个很多人不知道的小技巧如果你手头临时没有unarj又来不及安装可以先试试Pythonpython3 -c import zipfile, sys; print(not support arj!)别试了Python标准库不支持ARJ。老老实实装unarj或者用bsdtar顶上是正道。这期备份压缩系列第9篇就到这里下期如果有空我准备写写arj命令本身——没错就是那个能创建ARJ压缩包的命令虽然它更冷门但搞懂完整的ARJ工具链处理历史数据时会更从容。
返回列表