mv命令是 Linux 中用于移动或重命名文件和目录的核心命令。它可以将文件从一个位置移动到另一个位置或者更改文件/目录的名称。 基本语法mv[选项]源文件... 目标文件或目录 常用选项选项说明-i交互模式覆盖前询问确认。-f强制模式直接覆盖不询问。-n不覆盖已存在文件。-u只移动比目标文件新的文件。-v显示详细操作过程。-b覆盖前为目标文件创建备份。-S 后缀指定备份文件的后缀与-b一起使用。-t 目录将所有源文件移动到指定目录。--strip-trailing-slashes移除源文件末尾的斜杠。-T将目标视为普通文件而非目录。--help显示帮助信息。--version显示版本信息。 核心用法示例1. 重命名文件# 重命名单个文件mvoldname.txt newname.txt# 重命名并更改扩展名mvdocument.doc document.pdf2. 移动文件# 移动文件到目录mvfile.txt /home/user/documents/# 移动多个文件到目录mvfile1.txt file2.txt file3.txt /home/user/documents/# 使用通配符移动mv*.jpg /home/user/pictures/mvproject-*.tar.gz /backup/3. 移动目录# 移动整个目录mvold_directory/ new_location/# 移动目录并重命名mvsource_dir/ target_dir/new_name/4. 交互式操作# 覆盖前询问mv-iimportant.txt /backup/# 强制覆盖不询问mv-fdata.log /var/log/ 高级用法1. 条件移动# 只移动比目标新的文件mv-unew_version.txt /current/# 不覆盖已存在文件mv-nunique_file.txt /destination/# 移动并备份被覆盖的文件mv-bconfig.conf /etc/# 生成 /etc/config.conf~ 作为备份2. 批量重命名# 更改文件扩展名mv*.txt *.bak# 添加前缀forfilein*.jpg;domv$filevacation_$filedone# 移除前缀forfileinbackup_*;domv$file${file#backup_}done3. 使用-t选项# 将所有文件移动到指定目录mv-t/destination/ file1.txt file2.txt file3.txt# 结合 find 使用find.-name*.tmp-execmv-t/tmp/{}4. 安全操作技巧# 先列出要移动的文件ls*.logmv*.log /var/log/# 使用 rsync 进行测试模拟移动rsync-av--remove-source-files --dry-run source/ destination/# 实际移动rsync-av--remove-source-files source/ destination/⚠️ 重要注意事项覆盖风险mv会静默覆盖目标文件除非使用-i选项。# 危险直接覆盖mvnew_data.csv data.csv# 如果 data.csv 存在会被覆盖# 安全先检查ls-ldata.csvmv-inew_data.csv data.csv跨文件系统移动在同一文件系统内mv只是重命名速度快。跨文件系统实际是复制删除速度慢且需要足够空间。# 检查文件系统df-hfile.txt /destination/# 跨文件系统移动大文件cpfile.txt /destination/rmfile.txt符号链接处理# 移动符号链接本身默认mvsymlink /new/location/# 移动链接不跟踪目标# 如果要移动链接指向的文件mv$(readlink symlink)/new/location/权限保留mv会保留文件的所有者、权限和时间戳在同一文件系统内。跨文件系统移动时权限可能变化取决于目标文件系统的挂载选项。 实用场景1. 文件整理# 按扩展名分类mkdir-pimages documents archivesmv*.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. 备份轮转# 日志轮转mvserver.log server.log.oldtouchserver.log# 保留最近5个备份foriin{4..1};domv-fbackup.$i.tar.gz backup.$((i1)).tar.gz2/dev/nulldonemv-fbackup.tar.gz backup.1.tar.gz3. 脚本中的安全移动#!/bin/bash# 安全移动函数safe_move(){localsrc$1localdest$2if[[-e$dest]];thenecho警告:$dest已存在read-p是否覆盖? (y/N): -n1-rechoif[[!$REPLY~^[Yy]$]];thenecho取消移动return1fifimv-v$src$dest}# 使用示例safe_movedata.txt/backup/data.txt4. 批量重命名脚本#!/bin/bash# 批量添加时间戳forfilein*.log;dotimestamp$(date%Y%m%d_%H%M%S)mv$file${file%.log}_${timestamp}.logdone# 批量转换为小写forfilein*[A-Z]*;domv$file$(echo$file|tr[:upper:][:lower:])done 与相关命令对比命令用途特点mv移动/重命名原地操作速度快同文件系统cp复制创建副本保留原文件rm删除永久删除不可恢复默认ln创建链接创建硬链接或符号链接rename批量重命名支持正则表达式️ 故障排除1. 权限问题# 权限被拒绝sudomvsystem_file.conf /etc/# 或更改文件所有者sudochownuser:group file.txtmvfile.txt /destination/2. 目标不存在# 如果目标目录不存在mkdir-p/path/to/destinationmvfile.txt /path/to/destination/3. 文件名包含特殊字符# 包含空格的文件mvmy file.txtnew file.txt# 包含特殊字符mvfile\with\spaces.txt renamed.txtmvfile\*.txt special.txt# 使用引号处理所有特殊字符mv--file with spaces.txtnew name.txt4. 磁盘空间不足# 检查空间df-h/source/ /destination/# 如果目标空间不足mvlarge_file.txt /another/partition/ 最佳实践先测试后执行# 使用 echo 预览forfilein*.bak;doechomv$file${file%.bak}.backupdone# 实际执行时移除 echo使用版本控制# 重要文件移动前先备份cpimportant.conf important.conf.bakmvimportant.conf /new/location/记录操作# 记录移动操作mv-v*.log /archive/move_log.txt# 或使用 script 命令记录整个会话script-amove_session.log处理大量文件# 使用 find xargs 提高效率find.-name*.tmp-print0|xargs-0mv-t/tmp/# 或使用 parallel 并行处理find.-name*.jpg|parallelmv{}/images/ 实际应用示例1. 网站部署# 部署新版本mv/var/www/html /var/www/html.oldmv/tmp/new_version /var/www/htmlchown-Rwww-data:www-data /var/www/html# 快速回滚mv/var/www/html /var/www/html.brokenmv/var/www/html.old /var/www/html2. 日志管理# 每日日志归档LOG_DIR/var/log/myappARCHIVE_DIR/var/log/archives# 移动旧日志mv$LOG_DIR/*.log$ARCHIVE_DIR/$(date%Y-%m-%d)/# 压缩归档find$ARCHIVE_DIR-name*.log-mtime30-execgzip{}\;3. 照片整理# 按拍摄日期整理照片forphotoin*.jpg;dodate$(exiftool-d%Y-%m-CreateDate$photo|awk-F: {print $2})if[[-n$date]];thenmkdir-p$datemv$photo$date/fidone4. 临时文件清理# 移动临时文件到回收站TRASH_DIR$HOME/.trash/$(date%Y%m%d)mkdir-p$TRASH_DIR# 移动并记录mv-v/tmp/myapp_*$TRASH_DIR/2/dev/nullecho$(date): 清理临时文件$HOME/cleanup.logmv是 Linux 中最常用的文件操作命令之一。虽然功能简单但结合通配符、循环和其他命令可以完成复杂的文件管理任务。始终记住使用-i选项或先测试再执行可以避免意外覆盖重要文件。