Linux unarj命令

历史说明:unarj是一个用于解压缩ARJ格式文件的工具。ARJ是DOS和早期Windows时代流行的压缩格式,现在已较少使用。unarj主要用于兼容旧系统和处理遗留的ARJ压缩文件。
功能说明:unarj命令用于解压缩ARJ(Archived by Robert Jung)格式的压缩文件。它是处理.ARJ压缩文件的主要工具,支持基本的解压缩操作,但不支持创建ARJ压缩文件。
主要功能
  • 解压缩ARJ格式文件
  • 列出ARJ压缩包内容
  • 测试ARJ压缩文件完整性
  • 从ARJ压缩包提取文件
  • 支持多卷ARJ压缩文件
  • 查看压缩文件信息
安装说明

unarj在大多数Linux发行版中默认不安装,需要手动安装:

  • Debian/Ubuntu: sudo apt install unarj
  • RHEL/CentOS: sudo yum install unarj
  • Fedora: sudo dnf install unarj
  • Arch Linux: sudo pacman -S unarj
  • 从源码编译: 下载源码包自行编译

命令语法

语法格式
unarj [选项] 压缩文件 [文件名...]

命令参数

参数 说明
e 解压文件到当前目录(不带路径)
x 解压文件并保留目录结构
l 列出压缩文件内容
t 测试压缩文件完整性
v 详细列出压缩文件内容
p 解压文件到标准输出
d 删除压缩包中的文件
y 对所有询问回答"是"
-? 显示帮助信息
-jm 最大压缩模式
-jt 测试临时文件
-jp 显示完整路径
-jv 显示详细列表
-jx 从指定位置开始解压

使用示例

1. 基本解压操作 常用
示例
# 解压ARJ文件到当前目录(不保留路径)
unarj e archive.arj

# 解压ARJ文件并保留目录结构
unarj x archive.arj

# 解压特定文件
unarj e archive.arj file.txt

# 解压多个特定文件
unarj e archive.arj file1.txt file2.txt file3.txt

# 使用绝对路径解压
unarj e /path/to/archive.arj
2. 查看压缩包内容
# 列出压缩包内容
unarj l archive.arj

# 输出示例:
# Processing archive: archive.arj
#
# Date      Time    Attr      Size    Compressed  Name
# -----------------  --- ---------- ----------  ----
# 2020-05-10 14:30:30 -rw-r--r--     12456      5678  README.txt
# 2020-05-10 14:31:45 -rw-r--r--    245678     98765  document.doc
# 2020-05-10 14:32:10 -rwxr-xr-x     56789     23456  program.exe
# -----------------  --- ---------- ----------  ----
#                   3 files    314923    127899

# 详细列出压缩包内容
unarj v archive.arj

# 显示完整路径
unarj l -jp archive.arj
3. 测试压缩文件完整性
# 测试ARJ文件完整性
unarj t archive.arj

# 测试多个ARJ文件
unarj t archive1.arj archive2.arj archive3.arj

# 测试压缩包中的特定文件
unarj t archive.arj important.txt

# 在脚本中测试文件完整性
if unarj t archive.arj >/dev/null 2>&1; then
    echo "压缩文件完整"
else
    echo "压缩文件损坏"
fi
4. 解压到标准输出
# 将文件解压到标准输出
unarj p archive.arj readme.txt

# 查看压缩包中的文本文件
unarj p archive.arj readme.txt | less

# 搜索压缩包内容
unarj p archive.arj log.txt | grep "error"

# 统计文件行数
unarj p archive.arj data.csv | wc -l

# 保存到新文件
unarj p archive.arj config.ini > new_config.ini
5. 处理多卷ARJ压缩包
# 解压多卷ARJ文件(.arj, .a01, .a02等)
unarj e archive.arj

# 指定多卷文件的基础名
unarj e archive

# 解压特定卷中的文件
unarj e archive.arj -v2  # 只处理第二卷

# 列出多卷压缩包内容
unarj l archive.arj -v  # -v参数显示卷信息

# 测试多卷压缩包完整性
unarj t archive.arj -v

# 解压时跳过损坏的卷
unarj e archive.arj -y  # -y参数对所有询问回答"是"
6. 从压缩包中删除文件
# 从ARJ压缩包中删除文件
unarj d archive.arj oldfile.txt

# 删除多个文件
unarj d archive.arj file1.txt file2.txt

# 自动确认删除操作
unarj d -y archive.arj obsolete.doc

# 删除前先查看内容
unarj l archive.arj
unarj d archive.arj tempfile.tmp
unarj l archive.arj  # 确认文件已删除
7. 高级用法示例
# 解压时保留文件时间戳
unarj x archive.arj -jt

# 显示详细解压过程
unarj e -v archive.arj

# 解压特定类型的文件
unarj e archive.arj *.txt

# 解压到指定目录
mkdir extracted_files
cd extracted_files
unarj e ../archive.arj

# 批量解压多个ARJ文件
for arj_file in *.arj; do
    echo "解压: $arj_file"
    unarj e "$arj_file"
done

# 解压加密的ARJ文件(如果有密码)
# 注意:unarj不支持加密的ARJ文件,需要使用其他工具
# 如:7z x -p密码 archive.arj

ARJ格式详解

ARJ压缩格式介绍
ARJ格式特点
  • 开发者:Robert K. Jung
  • 流行时期:1990年代,DOS系统
  • 文件扩展名:.arj, .a01, .a02(多卷)
  • 压缩算法:LZ77变种
  • 最大特点:支持多卷压缩、文件注释
多卷命名规则
  • 第一卷:filename.arj
  • 第二卷:filename.a01
  • 第三卷:filename.a02
  • ...以此类推
  • 最多支持999卷
ARJ文件结构
# 查看ARJ文件头部信息
file archive.arj
# 输出:archive.arj: ARJ archive data, v14, slash-switched, os: DOS, arj protected

# 使用hexdump查看文件头
hexdump -C archive.arj | head -20
# 输出示例:
# 00000000  60 ea 27 00 1c 0a 02 00  10 00 00 00 00 00 00 00  |`.'.............|
# 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

# ARJ文件头特征
# 前两个字节:0x60 0xEA(ARJ签名)
# 接下来的2字节:头部大小
# 第一个文件头开始位置:0x20(32字节)

与其他解压工具对比

工具 支持格式 创建压缩 解压 流行程度 推荐用途
unarj .arj 不支持 支持 遗留系统 解压旧ARJ文件
arj .arj 支持 支持 遗留系统 完整ARJ支持
7z/7za .arj, .zip, .rar等 支持 支持 广泛 多种格式支持
unzip .zip 不支持 支持 非常广泛 解压ZIP文件
gunzip .gz, .z 不支持 支持 非常广泛 解压gzip文件
使用7z处理ARJ文件(推荐替代方案)
# 安装p7zip(支持ARJ格式)
sudo apt install p7zip-full  # Debian/Ubuntu
sudo yum install p7zip       # RHEL/CentOS

# 使用7z解压ARJ文件
7z x archive.arj

# 列出ARJ文件内容
7z l archive.arj

# 测试ARJ文件完整性
7z t archive.arj

# 解压到指定目录
7z x archive.arj -o/path/to/extract

# 解压特定文件
7z x archive.arj file.txt

# 7z支持更多格式
7z x archive.zip    # ZIP格式
7z x archive.rar    # RAR格式
7z x archive.tar.gz # tar.gz格式

实际应用脚本

脚本1:批量解压ARJ归档文件
#!/bin/bash
# 批量解压ARJ文件脚本

SOURCE_DIR="/path/to/arj/files"
TARGET_DIR="/path/to/extracted"
LOG_FILE="arj_extraction.log"
ERROR_LOG="arj_errors.log"

# 创建目录
mkdir -p "$SOURCE_DIR" "$TARGET_DIR"

echo "=== ARJ批量解压工具 ==="
echo "开始时间: $(date)"
echo "源目录: $SOURCE_DIR"
echo "目标目录: $TARGET_DIR"
echo ""

# 计数器
total_files=0
success_count=0
fail_count=0

# 检查unarj是否安装
if ! command -v unarj &> /dev/null; then
    echo "错误: unarj未安装"
    echo "请使用以下命令安装:"
    echo "  Debian/Ubuntu: sudo apt install unarj"
    echo "  RHEL/CentOS: sudo yum install unarj"
    exit 1
fi

# 处理所有ARJ文件
for arj_file in "$SOURCE_DIR"/*.arj "$SOURCE_DIR"/*.ARJ; do
    [ -f "$arj_file" ] || continue

    total_files=$((total_files + 1))
    filename=$(basename "$arj_file")
    file_basename="${filename%.*}"
    extract_dir="$TARGET_DIR/$file_basename"

    echo "处理文件 ($total_files): $filename"

    # 创建解压目录
    mkdir -p "$extract_dir"

    # 测试文件完整性
    echo -n "  测试文件完整性..."
    if unarj t "$arj_file" >/dev/null 2>&1; then
        echo "✓ 通过"
    else
        echo "✗ 失败"
        echo "$filename: 完整性测试失败" >> "$ERROR_LOG"
        fail_count=$((fail_count + 1))
        continue
    fi

    # 解压文件
    echo -n "  解压文件..."
    cd "$extract_dir"
    if unarj x "$arj_file" >/dev/null 2>&1; then
        # 检查解压结果
        extracted_count=$(find . -type f | wc -l)
        if [ "$extracted_count" -gt 0 ]; then
            echo "✓ 完成 (${extracted_count}个文件)"
            echo "$filename: 成功解压 ${extracted_count}个文件" >> "$LOG_FILE"
            success_count=$((success_count + 1))
        else
            echo "✗ 无文件解压"
            echo "$filename: 解压后无文件" >> "$ERROR_LOG"
            fail_count=$((fail_count + 1))
        fi
    else
        echo "✗ 解压失败"
        echo "$filename: 解压失败" >> "$ERROR_LOG"
        fail_count=$((fail_count + 1))
    fi

    cd - >/dev/null
    echo ""
done

# 显示统计信息
echo "=== 解压完成 ==="
echo "总文件数: $total_files"
echo "成功解压: $success_count"
echo "失败: $fail_count"
echo ""
echo "详细信息查看:"
echo "  日志文件: $LOG_FILE"
echo "  错误日志: $ERROR_LOG"
echo "解压文件位于: $TARGET_DIR"

# 如果有失败的文件,显示列表
if [ -f "$ERROR_LOG" ] && [ -s "$ERROR_LOG" ]; then
    echo ""
    echo "=== 失败文件列表 ==="
    cat "$ERROR_LOG"
fi
脚本2:ARJ文件转换工具(转ZIP格式)
#!/bin/bash
# ARJ转ZIP格式工具

CONVERT_DIR="/path/to/convert"
OUTPUT_DIR="/path/to/zip_files"
KEEP_ARJ=false  # 是否保留原始ARJ文件

# 创建目录
mkdir -p "$CONVERT_DIR" "$OUTPUT_DIR"

echo "=== ARJ转ZIP转换工具 ==="
echo "开始时间: $(date)"

# 检查必要工具
check_tool() {
    if ! command -v "$1" &> /dev/null; then
        echo "错误: $1 未安装"
        return 1
    fi
    return 0
}

# 检查unarj和zip
if ! check_tool "unarj"; then
    echo "请安装unarj: sudo apt install unarj"
    exit 1
fi

if ! check_tool "zip"; then
    echo "请安装zip: sudo apt install zip"
    exit 1
fi

# 转换函数
convert_arj_to_zip() {
    local arj_file="$1"
    local filename=$(basename "$arj_file")
    local basename="${filename%.*}"
    local temp_dir=$(mktemp -d)
    local zip_file="$OUTPUT_DIR/$basename.zip"

    echo "转换: $filename"

    # 1. 解压ARJ到临时目录
    echo -n "  解压ARJ..."
    if unarj x "$arj_file" -d "$temp_dir" >/dev/null 2>&1; then
        echo "✓ 完成"
    else
        echo "✗ 失败"
        rm -rf "$temp_dir"
        return 1
    fi

    # 2. 创建ZIP文件
    echo -n "  创建ZIP..."
    cd "$temp_dir"
    if zip -rq "$zip_file" .; then
        echo "✓ 完成"
    else
        echo "✗ 失败"
        cd - >/dev/null
        rm -rf "$temp_dir"
        return 1
    fi

    cd - >/dev/null

    # 3. 验证ZIP文件
    echo -n "  验证ZIP..."
    if unzip -tq "$zip_file" >/dev/null 2>&1; then
        echo "✓ 有效"
    else
        echo "✗ 无效"
        rm -f "$zip_file"
        rm -rf "$temp_dir"
        return 1
    fi

    # 4. 统计信息
    arj_size=$(stat -c%s "$arj_file")
    zip_size=$(stat -c%s "$zip_file")
    ratio=$(echo "scale=2; ($zip_size * 100) / $arj_size" | bc)

    echo "  原始ARJ: $(numfmt --to=iec $arj_size)"
    echo "  转换ZIP: $(numfmt --to=iec $zip_size)"
    echo "  大小比例: ${ratio}%"

    # 5. 清理临时目录
    rm -rf "$temp_dir"

    # 6. 可选:删除原始ARJ文件
    if [ "$KEEP_ARJ" = false ]; then
        echo "  删除原始ARJ文件"
        rm -f "$arj_file"
    fi

    return 0
}

# 处理所有ARJ文件
converted=0
failed=0

for arj_file in "$CONVERT_DIR"/*.arj "$CONVERT_DIR"/*.ARJ; do
    [ -f "$arj_file" ] || continue

    echo ""
    if convert_arj_to_zip "$arj_file"; then
        converted=$((converted + 1))
    else
        failed=$((failed + 1))
    fi
done

# 显示结果
echo ""
echo "=== 转换完成 ==="
echo "成功转换: $converted 个文件"
echo "转换失败: $failed 个文件"
echo "ZIP文件位于: $OUTPUT_DIR"
echo ""

# 显示磁盘使用情况
if [ "$converted" -gt 0 ]; then
    echo "磁盘使用情况:"
    du -sh "$OUTPUT_DIR"
fi
脚本3:ARJ文件信息统计工具
#!/bin/bash
# ARJ文件信息统计工具

SCAN_DIR="$1"
REPORT_FILE="arj_report_$(date +%Y%m%d_%H%M%S).csv"

# 默认扫描当前目录
if [ -z "$SCAN_DIR" ]; then
    SCAN_DIR="."
fi

echo "=== ARJ文件信息统计 ==="
echo "扫描目录: $SCAN_DIR"
echo "报告文件: $REPORT_FILE"
echo "开始时间: $(date)"
echo ""

# 创建CSV报告头
echo "文件名,大小,修改时间,文件数,压缩前大小,压缩后大小,压缩比,多卷,状态" > "$REPORT_FILE"

# 计数器
total_files=0
total_compressed=0
total_uncompressed=0

# 查找ARJ文件
find "$SCAN_DIR" -type f \( -name "*.arj" -o -name "*.ARJ" -o -name "*.a??" \) | while read arj_file; do
    total_files=$((total_files + 1))

    # 获取基本信息
    filename=$(basename "$arj_file")
    filepath=$(dirname "$arj_file")
    filesize=$(stat -c%s "$arj_file" 2>/dev/null || echo "0")
    modtime=$(stat -c%y "$arj_file" 2>/dev/null || echo "未知")

    echo "分析: $filename"

    # 检查是否为多卷文件
    is_multivolume=0
    if [[ "$filename" =~ \.a[0-9][0-9]$ ]]; then
        is_multivolume=1
        base_name=$(echo "$filename" | sed 's/\.[^.]*$//')
        echo "  检测到多卷文件: $base_name"
    fi

    # 获取ARJ文件信息
    if unarj l "$arj_file" >/dev/null 2>&1; then
        # 提取信息
        arj_info=$(unarj l "$arj_file" 2>/dev/null | tail -5)

        # 提取文件数和大小信息
        file_count=$(echo "$arj_info" | grep "files" | awk '{print $1}' || echo "0")
        uncompressed_size=$(echo "$arj_info" | grep "files" | awk '{print $3}' | tr -d ',' || echo "0")
        compressed_size=$(echo "$arj_info" | grep "files" | awk '{print $5}' | tr -d ',' || echo "0")

        # 计算压缩比
        if [ "$uncompressed_size" -gt 0 ]; then
            compression_ratio=$(echo "scale=2; ($compressed_size * 100) / $uncompressed_size" | bc)
        else
            compression_ratio="0"
        fi

        status="正常"

        # 累计统计
        total_compressed=$((total_compressed + compressed_size))
        total_uncompressed=$((total_uncompressed + uncompressed_size))
    else
        # 无法读取ARJ信息
        file_count="0"
        uncompressed_size="0"
        compressed_size="0"
        compression_ratio="0"
        status="损坏或非ARJ格式"
    fi

    # 写入CSV
    echo "\"$filename\",$filesize,\"$modtime\",$file_count,$uncompressed_size,$compressed_size,$compression_ratio,$is_multivolume,\"$status\"" >> "$REPORT_FILE"

    # 显示进度
    echo "  文件数: $file_count, 压缩比: ${compression_ratio}%, 状态: $status"
done

# 生成统计摘要
echo ""
echo "=== 统计摘要 ==="
echo "找到ARJ文件数: $total_files"
echo "总压缩大小: $(numfmt --to=iec $total_compressed)"
echo "总原始大小: $(numfmt --to=iec $total_uncompressed)"

if [ "$total_uncompressed" -gt 0 ]; then
    overall_ratio=$(echo "scale=2; ($total_compressed * 100) / $total_uncompressed" | bc)
    echo "总体压缩比: ${overall_ratio}%"
fi

echo ""
echo "详细报告已保存到: $REPORT_FILE"
echo "可以使用电子表格软件打开查看"

注意事项

重要注意事项:
  • 安装需求:unarj在大多数Linux发行版中默认不安装,需要手动安装
  • 功能限制:unarj只能解压ARJ文件,不能创建ARJ压缩包
  • 编码问题:ARJ文件可能使用DOS编码(如GBK、BIG5),解压时可能出现乱码
  • 文件名限制:ARJ使用8.3文件名格式,长文件名可能被截断
  • 多卷支持:支持多卷ARJ文件,但需要所有卷都在同一目录
  • 加密文件:unarj不支持加密的ARJ文件,需要使用其他工具
  • 过时格式:ARJ是过时的压缩格式,建议转换为ZIP等现代格式
  • 替代工具:7z/p7zip提供更好的ARJ支持,建议优先使用

常见问题

A: unarj不是大多数Linux发行版的标准组件,需要手动安装:
  • Debian/Ubuntu: sudo apt update && sudo apt install unarj
  • RHEL/CentOS: sudo yum install unarj 或从EPEL仓库安装
  • Fedora: sudo dnf install unarj
  • Arch Linux: sudo pacman -S unarj
  • openSUSE: sudo zypper install unarj
  • 从源码编译:
# 下载源码
wget http://example.com/unarj-source.tar.gz
tar -xzf unarj-source.tar.gz
cd unarj-source
make
sudo make install

替代方案:使用7z/p7zip,它支持ARJ格式且更常用:

# 安装p7zip
sudo apt install p7zip-full

# 使用7z解压ARJ
7z x archive.arj

A: ARJ文件可能使用DOS编码(如GBK、BIG5),而Linux默认使用UTF-8,可能导致乱码。解决方法:
  • 方法1:使用convmv转换文件名编码
  • 方法2:设置合适的locale环境变量
  • 方法3:使用7z,它可能更好地处理编码问题
  • 方法4:在Windows下解压后传输文件
示例:
# 方法1:安装并使用convmv
sudo apt install convmv

# 解压文件
unarj e archive.arj

# 转换文件名编码(GBK到UTF-8)
convmv -f GBK -t UTF-8 --notest *

# 方法2:设置locale(针对GBK编码)
export LANG=zh_CN.GBK
unarj e archive.arj

# 方法3:使用7z(推荐)
7z x -p密码 archive.arj

# 方法4:使用iconv配合find转换所有文件
find . -name "*.txt" -exec iconv -f GBK -t UTF-8 {} -o {}.utf8 \;
find . -name "*.txt.utf8" -exec rename 's/\.utf8$//' {} \;

注意:如果文件内容也是DOS编码,需要使用iconv转换文件内容。

A: 主要区别如下:
功能 unarj arj
创建ARJ压缩包 不支持 支持
解压ARJ压缩包 支持 支持
多卷压缩 仅解压 完整支持
加密/解密 不支持 支持
文件恢复 不支持 支持
自解压文件 仅解压 完整支持

安装arj:

# Debian/Ubuntu
sudo apt install arj

# RHEL/CentOS
sudo yum install arj

# 使用arj创建压缩包
arj a archive.arj file1.txt file2.txt

# 使用arj解压
arj x archive.arj

# 查看arj帮助
arj -?

推荐:如果需要创建ARJ文件或使用高级功能,安装完整的arj包。如果只需要解压,unarj足够。

相关命令

arj

完整的ARJ压缩工具:

# 创建ARJ压缩包
arj a archive.arj files/

# 解压ARJ文件
arj x archive.arj

# 查看ARJ文件内容
arj l archive.arj

# 测试ARJ文件
arj t archive.arj
7z

支持ARJ的通用压缩工具:

# 解压ARJ文件
7z x archive.arj

# 列出ARJ内容
7z l archive.arj

# 创建ZIP压缩包
7z a archive.zip files/

# 支持多种格式
7z x archive.rar
7z x archive.zip
unzip

解压ZIP文件:

unzip archive.zip
unzip -l archive.zip
unzip -t archive.zip
unzip -d dir archive.zip
file

识别文件类型:

file archive.arj
file unknown.archive
file -i archive.arj  # MIME类型
file -z archive.arj  # 查看压缩文件