简介
mv
命令源于 “move”,意为“移动”,主要用于移动文件或重命名文件。这个命令可以改变文件在文件系统中的位置或名称。区别于 cp
指令,cp
后的文件个数是增加的,所以会额外占用与原文件相同大小的磁盘空间,mv
则不会。在同一个目录内对文件进行移动的操作,实际上可以理解为重命名操作。
使用方式
mv [选项]... [-T] 源文件 目标文件
mv [选项]... 源文件... 目录
mv [选项]... -t 目录 源文件...
常用选项
-
--backup[=CONTROL]
:如果目标位置已存在同名文件,则对该文件进行备份。CONTROL
是可选的参数,其指明了具体的备份策略,下文会详细描述。 -
-b
:类似于--backup
但不需要参数。 -
-f, --force
:强制移动,如果存在覆盖行为不要进行提示。 -
-i, --interactive
:如果目标文件已存在,则在覆盖前进行交互性提示,让用户选择是否要覆盖。 -
-n, --no-clobber
:不对已存在的文件进行覆盖。 -
--strip-trailing-slashes
:去除命令行中每个源文件参数末尾的斜杠/
。 -
-S, --suffix=SUFFIX
:指定备份文件的后缀为SUFFIX
。 -
-t, --target-directory=DIRECTORY
:将命令行中列出的所有源文件移动到指定目录中。 -
-T, --no-target-directory
:将目标视为一个普通文件,而非目录。 -
-u, --update
:仅当源文件比目标文件更新或目标文件不存在时才进行移动。 -
-v, --verbose
:显示详细的处理过程。 -
-Z, --context
:将目标文件的安全上下文重置为默认类型。 -
--help
:显示帮助信息。 -
--version
:显示版本信息。
CONTROL
默认的备份后缀为 ~
,可以通过 --suffix
选项或 SIMPLE_BACKUP_SUFFIX
环境变量来修改。版本控制策略则可以通过 --backup
选项或者 VERSION_CONTROL
这个环境变量来修改,其可接受的值如下:
-
none,off
:从不创建备份文件(即使指定了 --backup 选项)。 -
numbered, t
:创建编号型的备份文件。 -
existing, nil
:如果已存在编号文件,则创建新的编号备份,如果没有则创建简单备份。 -
simple, never
:始终创建简单型备份文件。
参考示例
1. 移动文件到指定目录
mv ./sub_dir/
使用 mv
将 移动到当前目录下的
sub_dir
目录下:
jay@jaylinuxlenovo:~/test/cmd_test_dir$ ls -Rl
.:
total 8
-rw-rw-r-- 1 jay jay 121 Jul 28 17:26
drwxrwxr-x 2 jay jay 4096 Aug 12 11:25 sub_dir
./sub_dir:
total 0
jay@jaylinuxlenovo:~/test/cmd_test_dir$ mv ./sub_dir/
jay@jaylinuxlenovo:~/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
使用 ls
命令可以观察到移动之前 在当前目录下,
sub_dir
目录为空,移动之后 被成功转移到
sub_dir
中。
2. 移动时若存在覆盖则创建备份
mv -b ./sub_dir/
使用 -b
选项可以在目标文件存在的情况下自动创建一个备份:
jay@jaylinuxlenovo:~/test/cmd_test_dir$ mv -b ./sub_dir/
jay@jaylinuxlenovo:~/test/cmd_test_dir$ ls sub_dir/
~
移动后使用 ls
指令可以看到多了一个 ~
结尾的备份文件。
3. 强制覆盖目标不提示
mv -f ./sub_dir/
使用 -f
选项可以在源文件存在的情况下强制进行覆盖而不进行提示:
jay@jaylinuxlenovo:~/test/cmd_test_dir$ mv -f ./sub_dir/
jay@jaylinuxlenovo:~/test/cmd_test_dir$ ls ./sub_dir/
可以看到 mv -f
指令并没有提示任何信息,sub_dir
下的 实际已被覆盖。
4. 交互式操作,覆盖前询问
mv -i ./sub_dir/
由于 sub_dir
下已经存在一个 ,所以此时使用
mv
时会产生覆盖,同时由于指定了 -i
选项,系统会在覆盖前进行交互式询问:
jay@jaylinuxlenovo:~/test/cmd_test_dir$ mv -i ./sub_dir/
mv: overwrite './sub_dir/'? y
可以看到 mv
在覆盖前给出了提示,输入 y
并回车后进行了移动以及覆盖。
5. 显示详细的处理过程
mv -v ./
使用 -v
选项可以在指令执行时显示详细的执行信息:
jay@jaylinuxlenovo:~/test/cmd_test_dir$ mv -v ./
renamed '' -> './'
注意事项
- 使用
mv
时,若目标文件已存在,除非使用-i
,否则会直接覆盖,这可能导致数据丢失。
在移动目录时,用户需要具备相应的权限。 - 使用
-f
参数可以强制覆盖目标文件,但不会进行提示,所以需谨慎使用以避免不必要的数据丢失。 - 若源文件和目标文件在不同的文件系统上,
mv
实际上是复制后删除原文件的过程。 - 在脚本中使用
mv
时,建议结合-n
或-i
参数以防止意外覆盖文件。 - 如果同时指定了
-i
,-f
,-n
,那么只有最后一个选项会起作用。