mv 命令是 Linux 中用于移动或重命名文件和目录的核心命令。它可以将文件从一个位置移动到另一个位置,或者更改文件/目录的名称。
📖 基本语法
bash
mv [选项] 源文件... 目标文件或目录
🎯 常用选项
| 选项 | 说明 |
|---|---|
-i |
交互模式,覆盖前询问确认。 |
-f |
强制模式,直接覆盖不询问。 |
-n |
不覆盖已存在文件。 |
-u |
只移动比目标文件新的文件。 |
-v |
显示详细操作过程。 |
-b |
覆盖前为目标文件创建备份。 |
-S 后缀 |
指定备份文件的后缀(与 -b 一起使用)。 |
-t 目录 |
将所有源文件移动到指定目录。 |
--strip-trailing-slashes |
移除源文件末尾的斜杠。 |
-T |
将目标视为普通文件而非目录。 |
--help |
显示帮助信息。 |
--version |
显示版本信息。 |
💡 核心用法示例
1. 重命名文件
bash
# 重命名单个文件
mv oldname.txt newname.txt
# 重命名并更改扩展名
mv document.doc document.pdf
2. 移动文件
bash
# 移动文件到目录
mv file.txt /home/user/documents/
# 移动多个文件到目录
mv file1.txt file2.txt file3.txt /home/user/documents/
# 使用通配符移动
mv *.jpg /home/user/pictures/
mv project-*.tar.gz /backup/
3. 移动目录
bash
# 移动整个目录
mv old_directory/ new_location/
# 移动目录并重命名
mv source_dir/ target_dir/new_name/
4. 交互式操作
bash
# 覆盖前询问
mv -i important.txt /backup/
# 强制覆盖(不询问)
mv -f data.log /var/log/
🔧 高级用法
1. 条件移动
bash
# 只移动比目标新的文件
mv -u new_version.txt /current/
# 不覆盖已存在文件
mv -n unique_file.txt /destination/
# 移动并备份被覆盖的文件
mv -b config.conf /etc/
# 生成 /etc/config.conf~ 作为备份
2. 批量重命名
bash
# 更改文件扩展名
mv *.txt *.bak
# 添加前缀
for file in *.jpg; do
mv "$file" "vacation_$file"
done
# 移除前缀
for file in backup_*; do
mv "$file" "${file#backup_}"
done
3. 使用 -t 选项
bash
# 将所有文件移动到指定目录
mv -t /destination/ file1.txt file2.txt file3.txt
# 结合 find 使用
find . -name "*.tmp" -exec mv -t /tmp/ {} +
4. 安全操作技巧
bash
# 先列出要移动的文件
ls *.log
mv *.log /var/log/
# 使用 rsync 进行测试(模拟移动)
rsync -av --remove-source-files --dry-run source/ destination/
# 实际移动
rsync -av --remove-source-files source/ destination/
⚠️ 重要注意事项
-
覆盖风险 :
mv会静默覆盖 目标文件(除非使用-i选项)。bash# 危险:直接覆盖 mv new_data.csv data.csv # 如果 data.csv 存在,会被覆盖 # 安全:先检查 ls -l data.csv mv -i new_data.csv data.csv -
跨文件系统移动:
- 在同一文件系统内:
mv只是重命名,速度快。 - 跨文件系统:实际是复制+删除,速度慢且需要足够空间。
bash# 检查文件系统 df -h file.txt /destination/ # 跨文件系统移动大文件 cp file.txt /destination/ && rm file.txt - 在同一文件系统内:
-
符号链接处理:
bash# 移动符号链接本身(默认) mv symlink /new/location/ # 移动链接,不跟踪目标 # 如果要移动链接指向的文件 mv "$(readlink symlink)" /new/location/ -
权限保留:
mv会保留文件的所有者、权限和时间戳(在同一文件系统内)。- 跨文件系统移动时,权限可能变化(取决于目标文件系统的挂载选项)。
🔍 实用场景
1. 文件整理
bash
# 按扩展名分类
mkdir -p images documents archives
mv *.jpg *.png *.gif images/
mv *.doc *.pdf *.txt documents/
mv *.zip *.tar.gz archives/
# 按日期整理
mkdir -p "$(date +%Y-%m-%d)"
mv *."$(date +%Y%m%d)"*.log "$(date +%Y-%m-%d)/"
2. 备份轮转
bash
# 日志轮转
mv server.log server.log.old
touch server.log
# 保留最近5个备份
for i in {4..1}; do
mv -f backup.$i.tar.gz backup.$((i+1)).tar.gz 2>/dev/null
done
mv -f backup.tar.gz backup.1.tar.gz
3. 脚本中的安全移动
bash
#!/bin/bash
# 安全移动函数
safe_move() {
local src="$1"
local dest="$2"
if [[ -e "$dest" ]]; then
echo "警告: $dest 已存在"
read -p "是否覆盖? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "取消移动"
return 1
fi
fi
mv -v "$src" "$dest"
}
# 使用示例
safe_move "data.txt" "/backup/data.txt"
4. 批量重命名脚本
bash
#!/bin/bash
# 批量添加时间戳
for file in *.log; do
timestamp=$(date +%Y%m%d_%H%M%S)
mv "$file" "${file%.log}_${timestamp}.log"
done
# 批量转换为小写
for file in *[A-Z]*; do
mv "$file" "$(echo "$file" | tr '[:upper:]' '[:lower:]')"
done
📊 与相关命令对比
| 命令 | 用途 | 特点 |
|---|---|---|
mv |
移动/重命名 | 原地操作,速度快(同文件系统) |
cp |
复制 | 创建副本,保留原文件 |
rm |
删除 | 永久删除,不可恢复(默认) |
ln |
创建链接 | 创建硬链接或符号链接 |
rename |
批量重命名 | 支持正则表达式 |
🛠️ 故障排除
1. 权限问题
bash
# 权限被拒绝
sudo mv system_file.conf /etc/
# 或更改文件所有者
sudo chown user:group file.txt
mv file.txt /destination/
2. 目标不存在
bash
# 如果目标目录不存在
mkdir -p /path/to/destination
mv file.txt /path/to/destination/
3. 文件名包含特殊字符
bash
# 包含空格的文件
mv "my file.txt" "new file.txt"
# 包含特殊字符
mv file\ with\ spaces.txt renamed.txt
mv file\*.txt special.txt
# 使用引号处理所有特殊字符
mv -- "file with spaces.txt" "new name.txt"
4. 磁盘空间不足
bash
# 检查空间
df -h /source/ /destination/
# 如果目标空间不足
mv large_file.txt /another/partition/
📌 最佳实践
-
先测试后执行:
bash# 使用 echo 预览 for file in *.bak; do echo mv "$file" "${file%.bak}.backup" done # 实际执行时移除 echo -
使用版本控制:
bash# 重要文件移动前先备份 cp important.conf important.conf.bak mv important.conf /new/location/ -
记录操作:
bash# 记录移动操作 mv -v *.log /archive/ >> move_log.txt # 或使用 script 命令记录整个会话 script -a move_session.log -
处理大量文件:
bash# 使用 find + xargs 提高效率 find . -name "*.tmp" -print0 | xargs -0 mv -t /tmp/ # 或使用 parallel 并行处理 find . -name "*.jpg" | parallel mv {} /images/
🎯 实际应用示例
1. 网站部署
bash
# 部署新版本
mv /var/www/html /var/www/html.old
mv /tmp/new_version /var/www/html
chown -R www-data:www-data /var/www/html
# 快速回滚
mv /var/www/html /var/www/html.broken
mv /var/www/html.old /var/www/html
2. 日志管理
bash
# 每日日志归档
LOG_DIR="/var/log/myapp"
ARCHIVE_DIR="/var/log/archives"
# 移动旧日志
mv "$LOG_DIR"/*.log "$ARCHIVE_DIR/$(date +%Y-%m-%d)/"
# 压缩归档
find "$ARCHIVE_DIR" -name "*.log" -mtime +30 -exec gzip {} \;
3. 照片整理
bash
# 按拍摄日期整理照片
for photo in *.jpg; do
date=$(exiftool -d "%Y-%m" -CreateDate "$photo" | awk -F': ' '{print $2}')
if [[ -n "$date" ]]; then
mkdir -p "$date"
mv "$photo" "$date/"
fi
done
4. 临时文件清理
bash
# 移动临时文件到回收站
TRASH_DIR="$HOME/.trash/$(date +%Y%m%d)"
mkdir -p "$TRASH_DIR"
# 移动并记录
mv -v /tmp/myapp_* "$TRASH_DIR/" 2>/dev/null
echo "$(date): 清理临时文件" >> "$HOME/cleanup.log"
mv 是 Linux 中最常用的文件操作命令之一。虽然功能简单,但结合通配符、循环和其他命令,可以完成复杂的文件管理任务。始终记住使用 -i 选项或先测试再执行,可以避免意外覆盖重要文件。