mcopy 命令是 mtools 工具集的一部分,用于在 MS-DOS 文件系统(如软盘、U盘等FAT格式设备)和 Linux 系统之间复制文件和目录。它允许用户直接在 MS-DOS 格式的磁盘上操作文件,而无需先挂载这些设备。
mcopy [选项] 源文件 目标文件
常用形式:
# 从Linux复制到MS-DOS磁盘
mcopy 本地文件 a:目标文件
# 从MS-DOS磁盘复制到Linux
mcopy a:源文件 本地路径
# 复制多个文件
mcopy 文件1 文件2 a:目标目录
# 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
| 设备名 | 说明 | 对应的Linux设备 |
|---|---|---|
a: |
第一个软盘驱动器 | /dev/fd0 |
b: |
第二个软盘驱动器 | /dev/fd1 |
c: |
第一个硬盘分区 | /dev/sda1 或 /dev/hda1 |
d: |
第二个硬盘分区 | /dev/sdb1 或 /dev/hda2 |
z: |
自动检测的设备 | 自动映射 |
# 复制单个文件到软盘
mcopy file.txt a:
# 复制文件到指定目录
mcopy document.doc a:documents/
# 复制并重命名
mcopy image.jpg a:photos/vacation.jpg
# 显示详细过程
mcopy -v backup.tar a:backups/
# 从软盘复制文件到当前目录
mcopy a:file.txt .
# 从软盘复制文件到指定目录
mcopy a:document.doc /home/user/documents/
# 复制多个文件
mcopy a:*.txt /tmp/
# 保留文件时间戳
mcopy -m a:data.csv ./
# 递归复制整个目录到MS-DOS磁盘
mcopy -s myproject/ a:projects/
# 从MS-DOS磁盘递归复制目录到Linux
mcopy -s a:data/ ./backup/
# 递归复制并显示详细过程
mcopy -sv documents/ a:archive/
# 复制文本文件并转换换行符(Unix ↔ DOS)
mcopy -t script.sh a:scripts/
# 从DOS复制文本文件到Unix并转换
mcopy -t a:readme.txt ./
# 验证转换结果
file readme.txt
# 输出:readme.txt: ASCII text
# 备份软盘所有文件到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/
# 假设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/
#!/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/"
#!/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 "文件处理完成"
# 使用磁盘映像文件
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
#!/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 "备份完成"
# 交互模式处理文件名冲突
mcopy -i *.txt a:
# 不覆盖已存在的文件
mcopy -n important.dat a:
# 使用详细模式查看冲突
mcopy -v -i data*.csv a:archive/
# 先查看磁盘内容
mdir a:
# 创建目录结构
mmd a:documents a:images a:archive
# 复制文件到相应目录
mcopy *.txt a:documents/
mcopy *.jpg a:images/
# 验证结果
mdir a:
为了正确使用 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 选项进行交互确认