马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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 命令的操作速查与实例整理,示例输出来自真实终端环境,实际执行前请确认目标目录已有内容是否已备份。 |