linux mcopy命令

命令简介

mcopy 命令是 mtools 工具集的一部分,用于在 MS-DOS 文件系统(如软盘、U盘等FAT格式设备)和 Linux 系统之间复制文件和目录。它允许用户直接在 MS-DOS 格式的磁盘上操作文件,而无需先挂载这些设备。

注意: mcopy 命令需要 mtools 软件包支持,主要用于访问 FAT12、FAT16、FAT32 等 MS-DOS 文件系统。

语法

mcopy [选项] 源文件 目标文件

常用形式:

# 从Linux复制到MS-DOS磁盘
mcopy 本地文件 a:目标文件

# 从MS-DOS磁盘复制到Linux
mcopy a:源文件 本地路径

# 复制多个文件
mcopy 文件1 文件2 a:目标目录

常用选项

选项 说明
-i 交互模式,覆盖前提示确认
-n 不覆盖已存在的文件
-m 保留文件修改时间
-t 文本文件转换(转换换行符)
-s 递归复制目录
-Q 遇到错误时静默退出
-v 显示详细的操作过程
-D 调试级别 设置调试级别
-o 使用旧格式(8.3文件名)

安装方法

安装mtools包
# Ubuntu/Debian
sudo apt update
sudo apt install mtools

# CentOS/RHEL
sudo yum install mtools

# Fedora
sudo dnf install mtools

# Arch Linux
sudo pacman -S mtools

# 验证安装
mcopy --version

MS-DOS设备名称

设备名 说明 对应的Linux设备
a: 第一个软盘驱动器 /dev/fd0
b: 第二个软盘驱动器 /dev/fd1
c: 第一个硬盘分区 /dev/sda1/dev/hda1
d: 第二个硬盘分区 /dev/sdb1/dev/hda2
z: 自动检测的设备 自动映射

基本用法

1. 从Linux复制到MS-DOS磁盘
# 复制单个文件到软盘
mcopy file.txt a:

# 复制文件到指定目录
mcopy document.doc a:documents/

# 复制并重命名
mcopy image.jpg a:photos/vacation.jpg

# 显示详细过程
mcopy -v backup.tar a:backups/
2. 从MS-DOS磁盘复制到Linux
# 从软盘复制文件到当前目录
mcopy a:file.txt .

# 从软盘复制文件到指定目录
mcopy a:document.doc /home/user/documents/

# 复制多个文件
mcopy a:*.txt /tmp/

# 保留文件时间戳
mcopy -m a:data.csv ./
3. 递归复制目录
# 递归复制整个目录到MS-DOS磁盘
mcopy -s myproject/ a:projects/

# 从MS-DOS磁盘递归复制目录到Linux
mcopy -s a:data/ ./backup/

# 递归复制并显示详细过程
mcopy -sv documents/ a:archive/
4. 文本文件转换
# 复制文本文件并转换换行符(Unix ↔ DOS)
mcopy -t script.sh a:scripts/

# 从DOS复制文本文件到Unix并转换
mcopy -t a:readme.txt ./

# 验证转换结果
file readme.txt
# 输出:readme.txt: ASCII text

实际应用场景

场景1:软盘数据备份
# 备份软盘所有文件到Linux
mcopy -s a:* ./floppy_backup/

# 或者逐个文件备份
for file in $(mdir a: | grep -v "Directory" | awk '{print $1}'); do
    mcopy "a:$file" "./backup/$file"
done

# 验证备份
ls -la ./floppy_backup/
场景2:U盘文件管理
# 假设U盘配置为d:驱动器
# 复制文档到U盘
mcopy -m *.pdf *.doc d:documents/

# 从U盘复制照片到Linux
mcopy d:photos/*.jpg ./vacation_photos/

# 整理U盘文件
mcopy -s d:*.txt d:text_files/
mcopy -s d:*.jpg d:images/
场景3:旧系统数据迁移
#!/bin/bash
# 从多个软盘迁移数据

echo "开始数据迁移..."

for drive in a: b: c:; do
    if mdir "$drive" > /dev/null 2>&1; then
        echo "从 $drive 复制数据..."
        mkdir -p "./migrated_data/$drive"
        mcopy -s "$drive*" "./migrated_data/$drive/"
    fi
done

echo "数据迁移完成"
echo "迁移的数据位于: ./migrated_data/"
场景4:批量文件处理
#!/bin/bash
# 批量转换和复制文本文件

SOURCE_DIR="./source_docs"
TARGET_DRIVE="a:"

echo "处理文本文件..."

# 查找所有文本文件
find "$SOURCE_DIR" -name "*.txt" -o -name "*.md" | while read file; do
    filename=$(basename "$file")
    echo "处理: $filename"

    # 复制并转换换行符
    mcopy -t "$file" "$TARGET_DRIVEdocuments/$filename"
done

echo "文件处理完成"

高级用法

1. 使用磁盘映像文件
# 使用磁盘映像文件
mcopy -i disk.img file.txt ::

# 从映像文件复制文件
mcopy -i disk.img ::config.txt .

# 在脚本中处理多个映像
for img in *.img; do
    echo "处理映像: $img"
    mcopy -i "$img" ::* ./extracted_${img%.*}/
done
2. 自动备份脚本
#!/bin/bash
# 自动备份重要文件到MS-DOS磁盘

BACKUP_SOURCES=(
    "/home/user/documents"
    "/home/user/photos"
    "/home/user/music"
)
TARGET_DRIVE="a:"
LOG_FILE="/var/log/mcopy_backup.log"

log() {
    echo "$(date): $1" >> "$LOG_FILE"
}

log "开始备份..."

for source in "${BACKUP_SOURCES[@]}"; do
    if [ -d "$source" ]; then
        dir_name=$(basename "$source")
        log "备份: $source 到 ${TARGET_DRIVE}${dir_name}/"

        if mcopy -s -v "$source" "${TARGET_DRIVE}${dir_name}/" >> "$LOG_FILE" 2>&1; then
            log "✓ $source 备份成功"
        else
            log "✗ $source 备份失败"
        fi
    fi
done

log "备份完成"
3. 处理文件名冲突
# 交互模式处理文件名冲突
mcopy -i *.txt a:

# 不覆盖已存在的文件
mcopy -n important.dat a:

# 使用详细模式查看冲突
mcopy -v -i data*.csv a:archive/
4. 与其他mtools命令配合
# 先查看磁盘内容
mdir a:

# 创建目录结构
mmd a:documents a:images a:archive

# 复制文件到相应目录
mcopy *.txt a:documents/
mcopy *.jpg a:images/

# 验证结果
mdir a:

mtools配置

为了正确使用 mcopy,需要配置 /etc/mtools.conf 文件:

配置文件示例
# /etc/mtools.conf

# 软盘驱动器
drive a: file="/dev/fd0" exclusive
drive b: file="/dev/fd1" exclusive

# U盘和硬盘分区
drive c: file="/dev/sda1"
drive d: file="/dev/sdb1"
drive e: file="/dev/sdc1"

# 全局选项
mtools_skip_check=1
mtools_fat_compatibility=1

# 字符集设置(用于非英语文件名)
code_page=850
linestyle=unix

故障排除

常见问题及解决方案
# 1. 设备未找到错误
# 错误:Cannot initialize 'a:'
# 解决:检查设备配置或使用实际设备路径
mcopy file.txt /dev/fd0

# 2. 权限问题
# 错误:Permission denied
# 解决:使用sudo或检查设备权限
sudo mcopy file.txt a:

# 3. 磁盘空间不足
# 错误:No space left on device
# 解决:清理磁盘空间或使用其他磁盘
mdir a: | grep -v "<DIR>" | xargs -I {} mdel a:{}

# 4. 文件名编码问题
# 错误:Invalid argument
# 解决:配置正确的代码页
echo "code_page=936" >> ~/.mtoolsrc

实用技巧

  • 使用 -t 选项在Unix和DOS系统间转换文本文件
  • 使用 -m 选项保留文件时间戳,便于备份
  • 在脚本中使用 -Q 选项可以更好地处理错误
  • 使用 -s 选项递归复制整个目录结构
  • 配置 /etc/mtools.conf 可以简化设备访问
  • 使用 mdir 命令先查看磁盘内容再复制
  • 对于重要操作,使用 -i 选项进行交互确认

注意事项

  • mcopy 需要正确的 mtools 配置才能正常工作
  • MS-DOS 文件系统有文件名限制(8.3格式)
  • 某些选项可能因 mtools 版本不同而有所差异
  • 使用设备文件时需要相应的读写权限
  • 在处理重要数据前,建议先备份
  • mcopy 主要用于 FAT 文件系统,不适用于 NTFS 或 ext4
  • 对于现代U盘,通常使用标准的Linux挂载方式更简单