Linux命令-mv(移动或重命名文件和目录)

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/

⚠️ 重要注意事项

  1. 覆盖风险mv静默覆盖 目标文件(除非使用 -i 选项)。

    bash 复制代码
    # 危险:直接覆盖
    mv new_data.csv data.csv  # 如果 data.csv 存在,会被覆盖
    
    # 安全:先检查
    ls -l data.csv
    mv -i new_data.csv data.csv
  2. 跨文件系统移动

    • 在同一文件系统内:mv 只是重命名,速度快。
    • 跨文件系统:实际是复制+删除,速度慢且需要足够空间。
    bash 复制代码
    # 检查文件系统
    df -h file.txt /destination/
    
    # 跨文件系统移动大文件
    cp file.txt /destination/ && rm file.txt
  3. 符号链接处理

    bash 复制代码
    # 移动符号链接本身(默认)
    mv symlink /new/location/  # 移动链接,不跟踪目标
    
    # 如果要移动链接指向的文件
    mv "$(readlink symlink)" /new/location/
  4. 权限保留

    • 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/

📌 最佳实践

  1. 先测试后执行

    bash 复制代码
    # 使用 echo 预览
    for file in *.bak; do
        echo mv "$file" "${file%.bak}.backup"
    done
    
    # 实际执行时移除 echo
  2. 使用版本控制

    bash 复制代码
    # 重要文件移动前先备份
    cp important.conf important.conf.bak
    mv important.conf /new/location/
  3. 记录操作

    bash 复制代码
    # 记录移动操作
    mv -v *.log /archive/ >> move_log.txt
    
    # 或使用 script 命令记录整个会话
    script -a move_session.log
  4. 处理大量文件

    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 选项或先测试再执行,可以避免意外覆盖重要文件。

相关推荐
wh_xia_jun2 小时前
Windows/Linux 自动适配 + Pydantic Settings 配置
linux·运维·windows
第二只羽毛2 小时前
C++ 高并发内存池4
java·大数据·linux·c++·算法
风吹落叶32572 小时前
RabbitMQ 集群
linux·分布式·rabbitmq
long_songs2 小时前
纯前端 PNG/JPG 转 PDF 工具(无需服务器,源码分享)
服务器·前端·pdf
斌味代码2 小时前
Docker + 宝塔:容器化部署最佳实践(2026最新版)
运维·docker·容器
克莱因3582 小时前
Linux 进程监控
linux·运维·服务器
半个俗人2 小时前
05.Linux网络命令
linux·服务器·网络
Agent产品评测局2 小时前
企业 HR 自动化落地,入转调离全流程自动化实现方法:基于企业级智能体的技术路径与方案盘点
运维·人工智能·ai·chatgpt·自动化
羚羊角uou2 小时前
【Linux网络】select详解
linux·服务器·开发语言·网络·c++