linux mv命令

命令简介

mv 命令是 Linux 系统中最基本和常用的文件操作命令之一,主要用于移动文件或目录,也可以用于重命名文件。它是 "move" 的缩写,能够高效地在文件系统中重新定位文件和目录。

注意: mv 命令在移动文件时会保留文件的原始属性(如权限、时间戳等),但重命名文件时不会改变文件的 inode 编号。

语法

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

或者移动多个文件:

mv [选项] 源文件... 目标目录

常用选项

选项 说明
-i 交互模式,覆盖前提示确认
-f 强制模式,直接覆盖不提示
-n 不覆盖已存在的文件
-v 显示详细的操作过程
-u 只在源文件比目标文件新,或目标文件不存在时才移动
-t 目录 指定目标目录,将所有源文件移动到该目录
--backup[=控制] 覆盖前备份目标文件
-b 类似 --backup,但不接受参数
-S 后缀 指定备份文件的后缀

基本用法

1. 重命名文件
# 将文件从 oldname.txt 重命名为 newname.txt
mv oldname.txt newname.txt

# 重命名并显示详细信息
mv -v oldfile.txt newfile.txt
# 输出:'oldfile.txt' -> 'newfile.txt'
2. 移动文件到目录
# 移动单个文件到目录
mv file.txt /path/to/destination/

# 移动多个文件到目录
mv file1.txt file2.txt file3.txt /target/directory/

# 使用通配符移动多个文件
mv *.jpg /path/to/images/
3. 移动目录
# 移动整个目录
mv old_directory/ new_directory/

# 移动目录到其他位置
mv my_project/ /home/user/projects/
4. 交互式操作
# 覆盖前提示确认
mv -i important_file.txt backup/
# 输出:mv: overwrite 'backup/important_file.txt'?

# 强制覆盖,不提示
mv -f file.txt destination/
5. 备份和更新
# 覆盖前创建备份
mv -b old.txt new.txt
# 如果 new.txt 存在,会创建 new.txt~ 作为备份

# 只在新文件更新时才移动
mv -u new_data.txt archive/

实际应用场景

场景1:文件整理和组织
# 整理下载目录
mkdir -p ~/Downloads/{images,docs,archives}
mv ~/Downloads/*.jpg ~/Downloads/*.png ~/Downloads/images/
mv ~/Downloads/*.pdf ~/Downloads/*.doc ~/Downloads/docs/
mv ~/Downloads/*.zip ~/Downloads/*.tar.gz ~/Downloads/archives/

# 清理临时文件
mkdir temp_backup
mv *.tmp *.log temp_backup/
场景2:项目文件管理
# 重命名项目文件
mv project_old/ project_new/

# 移动源代码文件
mv *.c src/
mv *.h include/

# 备份配置文件
mv config.conf config.conf.backup
mv new_config.conf config.conf
场景3:日志文件轮转
# 日志轮转操作
mv app.log app.log.old
touch app.log

# 或者使用时间戳
mv server.log server.log.$(date +%Y%m%d)
场景4:批量重命名
# 批量添加前缀
for file in *.txt; do
    mv "$file" "backup_$file"
done

# 批量更改扩展名
for file in *.jpeg; do
    mv "$file" "${file%.jpeg}.jpg"
done

# 使用 rename 命令进行复杂重命名(需要安装)
rename 's/old/new/' *.txt

高级用法

1. 使用 -t 选项
# 将多个文件移动到指定目录
mv -t /target/directory/ file1.txt file2.txt file3.txt

# 这在脚本中特别有用
files=(*.txt)
mv -t /backup/ "${files[@]}"
2. 备份策略
# 使用数字备份
mv --backup=numbered important.txt backup/
# 如果 backup/important.txt 存在,会创建 backup/important.txt.~1~

# 自定义备份后缀
mv -b -S .bak file.txt destination/
# 如果目标文件存在,会创建 destination/file.txt.bak
3. 在脚本中使用mv
#!/bin/bash
# 安全的文件移动脚本

backup_file() {
    local src=$1
    local dest=$2

    if [ -e "$dest" ]; then
        local backup_name="${dest}.$(date +%Y%m%d_%H%M%S).bak"
        echo "备份已存在的文件: $dest -> $backup_name"
        mv "$dest" "$backup_name"
    fi

    mv -v "$src" "$dest"
}

# 使用函数
backup_file "new_config.conf" "/etc/app/config.conf"
4. 处理特殊文件名
# 移动包含空格的文件
mv "file with spaces.txt" "new name with spaces.txt"

# 移动以破折号开头的文件
mv -- -filename.txt normal_name.txt
# 或者
mv ./-filename.txt normal_name.txt

# 移动包含特殊字符的文件
mv "file*with?special[chars].txt" simple_name.txt

安全使用建议

1. 防止数据丢失
# 在 ~/.bashrc 中设置别名,默认使用交互模式
alias mv='mv -i'

# 重要操作前先检查
ls -l source_file.txt
ls -l destination_directory/
mv -i source_file.txt destination_directory/
2. 使用版本控制
# 在Git仓库中操作,可以回滚错误的重命名
git mv oldname.txt newname.txt
git commit -m "重命名文件"

# 如果出错可以回滚
git reset --hard HEAD
3. 创建备份脚本
#!/bin/bash
# 安全的mv包装脚本

safemv() {
    if [ $# -lt 2 ]; then
        echo "用法: safemv 源文件 目标文件"
        return 1
    fi

    local src=$1
    local dest=$2

    # 检查源文件是否存在
    if [ ! -e "$src" ]; then
        echo "错误: 源文件 '$src' 不存在"
        return 1
    fi

    # 如果目标是目录,检查是否可写
    if [ -d "$dest" ]; then
        if [ ! -w "$dest" ]; then
            echo "错误: 目标目录 '$dest' 不可写"
            return 1
        fi
    fi

    # 执行移动操作
    mv -i "$@"
}

与其他命令的比较

命令 用途 特点
mv 移动/重命名文件 快速,保留文件属性,在同一文件系统内是原子操作
cp 复制文件 创建文件副本,源文件和目标文件同时存在
rm 删除文件 永久删除文件,不可恢复(除非使用特殊工具)
rename 批量重命名 基于正则表达式的批量重命名
ln 创建链接 创建文件链接,不移动实际数据

实用技巧

  • 使用 mv -i 作为默认别名可以防止意外覆盖文件
  • 在脚本中使用 mv -f 可以避免交互提示
  • 使用 mv -v 可以查看详细的操作过程
  • 对于跨文件系统的移动,mv 实际上执行的是复制+删除操作
  • 使用 strace mv file1 file2 可以查看 mv 命令的系统调用
  • 在重命名前使用 ls -i 检查文件的 inode 编号

注意事项

  • mv 命令会覆盖目标文件而不警告(除非使用 -i 选项)
  • 在同一文件系统内移动文件是快速操作,只更新目录条目
  • 跨文件系统移动文件实际上是复制+删除,可能很慢
  • 移动目录时,目录内的所有内容也会被移动
  • 不能移动当前工作目录或其父目录
  • 使用通配符时要小心,确保匹配正确的文件
  • 重要文件操作前建议先备份