Linux 常用下令 - mv 【移动或重命名文件】

[复制链接]
发表于 2026-10-4 21:21:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

mv 源自英文 move,意思就是移动。它主要用来把文件挪到别的位置,或者就地改名。和 cp 最大的区别在于:cp 之后源文件还在、磁盘上多一份同样大小的数据;mv 在同一文件系统里移动只是改了目录项,不产生新数据,也不额外占空间。本文把 mv 的三种用法、常用选项、备份策略、实测示例和注意事项整理成一份可以照着抄的速查。

三种基本用法

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

第一种是重命名,源和目标都是具体路径;第二种是移动多个文件到某个目录;第三种用 -t 先指定目标目录,后面跟一堆源,在脚本里批量移动时特别省事。

顺带说清一个概念:同一个目录内对文件「移动」,本质上就是重命名,两者在 mv 看来是同一件事——换了个名字,inode 没变。

常用选项

  • --backup[=CONTROL]:目标位置已有同名文件时,先给它做一份备份再覆盖。CONTROL 决定备份策略,可省略。
  • -b:等价于 --backup 但不带参数,用默认策略。
  • -f, --force:强制移动,覆盖发生时不做任何提示。
  • -i, --interactive:目标文件已存在时,覆盖前先交互询问。
  • -n, --no-clobber:不覆盖已存在的文件,直接跳过。
  • --strip-trailing-slashes:去掉命令行里每个源文件参数末尾的斜杠。
  • -S, --suffix=SUFFIX:指定备份文件的后缀,默认是波浪号。
  • -t, --target-directory=DIRECTORY:把后面列出的所有源文件都移进这个目录。
  • -T, --no-target-directory:把目标当普通文件,而不是目录。
  • -u, --update:只有源文件比目标更新、或目标不存在时才移动。
  • -v, --verbose:打印详细处理过程,脚本调试必备。
  • -Z, --context:把目标文件的安全上下文重置为默认类型,SELinux 环境下有用。
  • --help / --version:查看帮助与版本。

日常真正高频的是 -i、-f、-v、-b、-n 这五个,其余了解即可。

备份策略 CONTROL

默认备份后缀是 ~(波浪号),可以用 --suffix 选项或 SIMPLE_BACKUP_SUFFIX 环境变量改。备份版本策略通过 --backup 或 VERSION_CONTROL 环境变量设定,可选值有四类:

  • none, off:从不创建备份,哪怕你显式写了 --backup。
  • numbered, t:创建带编号的备份文件,每次覆盖都生成备份 1、2、3……
  • existing, nil:如果已存在编号备份就新建编号备份,没有则退化成简单备份。
  • simple, never:始终创建简单型备份,也就是追加一个后缀。

在自动化脚本里建议显式带上 --backup=numbered,出现意外覆盖时还能按编号找回上一版。

示例一:把文件移到指定目录

mv new.txt ./sub_dir/

执行前后用 ls -Rl 对照最清楚:

jay@jay-linux:~/test/cmd_test_dir$ ls -Rl
.:
total 8
-rw-rw-r-- 1 jay jay   121 Jul 28 17:26 new.txt
drwxrwxr-x 2 jay jay  4096 Aug 12 11:25 sub_dir

./sub_dir:
total 0

jay@jay-linux:~/test/cmd_test_dir$ mv new.txt ./sub_dir/
jay@jay-linux:~/test/cmd_test_dir$ ls -Rl
.:
total 4
drwxrwxr-x 2 jay jay  4096 Aug 12 12:42 sub_dir

./sub_dir:
total 4
-rw-rw-r-- 1 jay jay   121 Jul 28 17:26 new.txt

移动前 new.txt 在当前目录、sub_dir 是空的;移动后 new.txt 出现在 sub_dir 里,当前目录少了一个条目。这就是 mv 在同级文件系统下最直观的行为。

示例二:覆盖前自动备份

mv -b new.txt ./sub_dir/new.txt

目标文件已经存在时会先留一份备份,执行后 ls 能看到多了一个以 ~ 结尾的文件。

jay@jay-linux:~/test/cmd_test_dir$ mv -b new.txt ./sub_dir/new.txt
jay@jay-linux:~/test/cmd_test_dir$ ls
sub_dir  new.txt  new.txt~

示例三:强制覆盖不提示

mv -f new.txt ./sub_dir/new.txt

-f 直接覆盖,屏幕上不会有任何输出。这也意味着一旦目标里已有的内容不重要、你又忘了 -i,那就真找不回来了。

jay@jay-linux:~/test/cmd_test_dir$ mv -f new.txt ./sub_dir/new.txt
jay@jay-linux:~/test/cmd_test_dir$ ls ./sub_dir/new.txt

示例四:覆盖前交互询问

mv -i new.txt ./sub_dir/new.txt

因为 sub_dir 下已经有 new.txt,这一句会先问一句再动手:

jay@jay-linux:~/test/cmd_test_dir$ mv -i new.txt ./sub_dir/new.txt
mv: overwrite './sub_dir/new.txt'? y

输入 y 回车后完成移动与覆盖,输入 n 则放弃。人工操作场景默认更安全的选择其实是不加 -f,让系统自己来问。

示例五:显示详细处理过程

mv -v new.txt ./new-rename.txt

输出会告诉你做了什么:

jay@jay-linux:~/test/cmd_test_dir$ mv -v new.txt ./new-rename.txt
renamed 'new.txt' -> './new-rename.txt'

注意这里的目标没有带子目录,属于同一目录内的改名,mv 会直接说 renamed。批量挪文件出问题时,加 -v 能把每一步都落下来,方便定位哪一步断了。

注意事项

  • 目标文件已存在时,除非你加了 -i,否则 mv 直接覆盖,原内容就丢了,误操作风险很高。
  • 移动目录时需要对目标目录具备相应写权限。
  • -f 强制覆盖且不提示,用错会造成不必要的损失,生产环境慎用。
  • 源文件和目标位于不同文件系统时,mv 实际是「复制再删除原文件」,不是瞬间完成,大文件会观察到耗时和 IO 波动。
  • 脚本里使用 mv 时,建议配上 -n 或 -i 防止意外覆盖。
  • -i、-f、-n 同时指定时,只有最后一个生效,写选项顺序前先想清楚要留哪个行为。

小结

mv 的能力集中在「挪位置」和「改名字」两件事上,选项多但真正常用的就那几个:改名前想留退路就 -b,怕覆盖就 -i 或 -n,批量传送就 -t,调试看过程就 -v,确认无重要数据时才用 -f。理解了「同分区是改名、跨分区是复制加删除」这条底层规则,再回看这些选项的取舍就很自然了。

qidao123.com企服评测-应用市场 编辑提示:本文为 Linux mv 命令的操作速查与实例整理,示例输出来自真实终端环境,实际执行前请确认目标目录已有内容是否已备份。

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表