Linux 命令(文件和目录管理 - mv)

时间:2022-10-21 17:40:52

简述

mv 命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖。

命令介绍

  • 命令名称
    mv

  • 命令全称
    move

  • 基本语法
    mv [选项]… [-T] 源文件 目标文件
    或:mv [选项]… 源文件… 目录
    或:mv [选项]… -t 目录 源文件…

  • 功能描述
    将源文件重命名为目标文件,或将源文件移动至指定目录。

命令选项

选项 说明
--backup[=CONTROL] 为每个已存在的目标文件创建备份
-b 类似 --backup,但不接受参数
-f, --force 覆盖前不询问
-i, --interactive 覆盖前询问
-n, --no-clobber 不覆盖已存在文件。如果指定了 -i、-f、-n 中的多个,仅最后一个生效。
--strip-trailing-slashes 去掉每个源文件参数尾部的斜线
-S, --suffix=SUFFIX 替换常用的备份文件后缀
-t, --target-directory=DIRECTORY 指定源文件要移动到目标目录
-T, --no-target-directory 将目标文件视作普通文件处理
-u, --update 当目标文件不存在,或者源文件比目标文件新时,才执行移动操作。
-v, --verbose 详细显示进行的步骤
-Z, --context 显示文件除组信息外的详细信息
--help 在标准输出上显示帮助信息并退出
--version 在标准输出上显示版本信息并退出

使用范例

1.移动文件

注意:文件的源地址和目标地址必须不同。

[wang@localhost linux]$ ls
hello.sh linux-program.pdf
# 将 hello.sh 从当前目录移动至 /home/wang/script/
[wang@localhost linux]$ mv hello.sh /home/wang/script/
[wang@localhost linux]$ ls
linux-program.pdf
[wang@localhost linux]$ ls /home/wang/script/
hello.sh

正如所见,当移动 hello.sh 文件时,先前目录的文件就被删除了。

2.移动多个文件

如果想一次移动多个文件,可以将他们放在一行并用空格分开。

[wang@localhost c]$ mv hello.c qt5_cadaques.pdf /home/wang/script/
[wang@localhost c]$ ls /home/wang/script/
hello.c hello.sh qt5_cadaques.pdf

如果文件有规律可循的话,那么可以使用通配符。比如,为了移除所有以 .sh 为扩展名的文件,可以用下面的命令:

[wang@localhost c]$ mv *.sh /home/wang/script/

3.移动目录

[wang@localhost doc]$ tree /home/wang/script/
/home/wang/script/
├── hello.c
├── hello.sh
└── qt5_cadaques.pdf

0 directories, 3 files
[wang@localhost doc]$ tree linux/
linux/
└── linux-program.pdf

0 directories, 1 file
[wang@localhost doc]$ mv linux/ /home/wang/script/
[wang@localhost doc]$ tree /home/wang/script/
/home/wang/script/
├── hello.c
├── hello.sh
├── linux
│ └── linux-program.pdf
└── qt5_cadaques.pdf

1 directory, 4 files

4.重命名文件或目录

也可以用 mv 命令来重命名文件或目录,不过目标位置和源位置必须相同,文件名必须不同。

[wang@localhost c]$ ls
QmlBook-In-Chinese.pdf qwt-6.1.1.pdf
[wang@localhost c]$ mv qwt-6.1.1.pdf qwt.pdf
[wang@localhost c]$ ls
QmlBook-In-Chinese.pdf qwt.pdf

5.打印详细信息

当移动或重命名一大堆文件或目录时,可能会想在不去目标位置去查看的情况下知道自己的命令是否成功地执行了,这就要用到 -v 选项了。

[wang@localhost c++]$ mv -v qwt.pdf /home/wang/script/
"qwt.pdf" -> "/home/wang/script/qwt.pdf"

6.使用交互模式

当移动文件时,目标位置恰好有同名文件,这时 mv 命令会覆盖掉原来的文件。如果想产生一个关于覆盖文件的提示,可以使用 -i 选项。

[wang@localhost doc]$ mv -i hello.sh /home/wang/script/
mv:是否覆盖"/home/wang/script/hello.sh"? y
[wang@localhost doc]$

该提示会告诉我们目标位置处是否有同名文件。如果按 y 键,那么该文件将会被删除,否则不会。

7.使用更新选项

选项 -u ,当目标文件不存在,或者源文件比目标文件新时,才执行移动操作。

[wang@localhost doc]$ ls -l hello.sh 
-rw-rw-r--. 1 wang wang 0 1019 13:08 hello.sh
[wang@localhost doc]$ ls -l /home/wang/script/hello.sh
-rw-rw-r--. 1 wang wang 0 1019 13:09 /home/wang/script/hello.sh
[wang@localhost doc]$ mv -uv hello.sh /home/wang/script/
[wang@localhost doc]$

可以看到文件没有被移动,是因为 hello.sh 最近的修改时间戳比 /home/wang/script/hello.sh 的旧。

8.不覆盖任何已存在的文件

选项 -i 会询问是否要覆盖文件,选项 -n 则不会允许覆盖任何已存在的文件。

[wang@localhost doc]$ mv -vn hello.sh /home/wang/script/
[wang@localhost doc]$ ls *.sh
hello.sh

加上 -v 选项,可以看到文件没有被移动到了目标目录下,使用 ls 再次验证,原文件仍然存在。

9.复制时创建备份

默认情况下,移动文件将会覆盖已存在的目标文件。但是如果移动错了文件,而目标文件已经被新的文件覆盖了,这时应该怎么办才好呢?可以用 -b 选项,该选项会在新文件覆盖旧文件时将旧文件做备份。

[wang@localhost doc]$ mv -bv hello.sh /home/wang/script/
"hello.sh" -> "/home/wang/script/hello.sh" (备份:"/home/wang/script/hello.sh~")
[wang@localhost doc]$ ls -l /home/wang/script/hello.sh*
-rw-rw-r--. 1 wang wang 0 1019 12:52 /home/wang/script/hello.sh
-rw-rw-r--. 1 wang wang 0 1019 12:45 /home/wang/script/hello.sh~

目标目录下出现了名为 hello.sh 和 hello.sh~ 的文件,波浪符号(~)意味着这些文件是备份文件。从属性中可以看到,备份文件比 hello.sh 要旧。

10.无条件覆盖已经存在的文件

当希望无论如何都覆盖已经存在的文件或目录时,可以使用 -f 选项。使用此参数时,必须知道你在做什么。

[wang@localhost doc]$ mv -fv hello.sh /home/wang/script/
"hello.sh" -> "/home/wang/script/hello.sh"