目录
9. shell命令--mv
功能说明
mv 是 Linux 中的一个非常有用的命令,用于移动或重命名文件和目录。mv 命令来自英文单词 move 的缩写,中文译为“移动”,其功能与英文含义相同,能够对文件进行剪切和重命名操作。
这是一个被高频使用的文件管理命令,我们需要留意它与复制命令的区别。cp 命令是用于文件的复制操作,文件个数是增加的,而 mv 则为剪切操作,也就是对文件进行移动(搬家)操作,文件位置发生变化,但总个数并无增加。
语法格式
mv [选项] 源文件或目录 目标文件或目录
SYNOPSIS
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
选项说明
- -i:在覆盖目标文件之前提示用户确认。
- -f:若目标文件已经存在,不会询问是否覆盖。
- -u:只在源文件比目标文件新,或者当目标文件不存在时,才移动或重命名源文件。
- -b:在覆盖目标文件之前,对其进行备份。
- -n:不覆盖已经存在的文件。
- -t:指定mv的目标目录,此时目标目录在前,源文件在后。
- --backup[=CONTROL]:为每个要覆盖的文件创建备份。
- --help:显示帮助信息。
- --version:显示版本信息。
实践操作
1. 对指定文件进行剪切后粘贴(重命名)操作
mkdir -p /test/mv #创建测试目录
cd /test/mv #切换到测试目录
touch file1 #创建文件 file1
ls #查看一下
mv file1 file2 #文件 file2 之前不存在,这是移动是重命名
ls #查看一下,发现 file1 变成 file2 了
cp file2 file1 #复制一下文件
ls #再次查看
!mv #再次移动试试,若目标文件存在,则会系统提示,输入 y 表示确认,n 表示不同意,演示写 n
ls #查看一下
alias mv #也是一样,系统做了别名
2. 将指定文件移动到指定目录中,保留文件原始名称
mkdir dir1 #创建目录 dir1
ls #查看一下
mv file1 dir1/ #移动文件 file1 到目录 dir1 下
ls #查看一下
ls dir1/ #查看一下目录 dir1
3. 将指定目录移动到指定目录中,并定义新的目录名称
mkdir dir2 #创建目录 dir2
ls #查看一下
ls dir1/ #查看一下目录 dir1
mv dir2 dir1/Newdir #移动目录 dir2 到目录 dir1 下,并将目录 dir2 改名为 Newdir
ls #查看一下
ls dir1/ #查看一下目录 dir1
4. 将指定目录中所有的文件都移动到当前工作目录中
ls #查看一下
mkdir dir1/dir_mv{1..3} #批量创建目录
cp dir1/file1 . #复制目录 dir1 下文件 file1 到当前目录,点 . 表示当面目录
ls #查看一下
ls dir1 #查看一下 dir1
mv dir1/* . #移动目录 dir1 下所有内容,若存在,则提示覆盖,演示写 y
ls #查看一下
5. 移动多个文件或目录
mv Newdir/ dir_mv* file* dir1/ #一次移动内容到目录 dir1 ,也可写为 mv * dir1
ls #查看一下
ls dir1/ #查看一下 dir1
6. 将源文件和目标文件调换,移动文件到目录(-t参数)
cd dir1/ #切换到目录 dir1
mv Newdir/ dir_mv11 #更改目录 Newdir 为 dir_mv11,
mv dir_mv3/ dir_mv22 #一样,这和改文件名称一样
ls #查看一下
mv dir_mv1 dir_mv2 #先正常移动,即格式为:mv 源文件 目标文件
mv -t dir_mv11/ dir_mv22 #使用参数 -t ,即格式为:mv -t 目标文件 源文件
ls #查看一下
ls dir_mv11/ #查看一下 dir_mv11
ls dir_mv2/ #查看一下 dir_mv2
命令示例:1. 对指定文件进行剪切后粘贴(重命名)操作
mkdir -p /test/mv
cd /test/mv
touch file1
ls
mv file1 file2
ls
cp file2 file1
ls
!mv
ls
alias mv
输出结果:
[root@MineGi ~]# mkdir -p /test/mv
[root@MineGi ~]# cd /test/mv
[root@MineGi /test/mv]# touch file1
[root@MineGi /test/mv]# ls
file1
[root@MineGi /test/mv]# mv file1 file2
[root@MineGi /test/mv]# ls
file2
[root@MineGi /test/mv]# cp file2 file1
[root@MineGi /test/mv]# ls
file1 file2
[root@MineGi /test/mv]# !mv
mv file1 file2
mv:是否覆盖"file2"? n
[root@MineGi /test/mv]# ls
file1 file2
[root@MineGi /test/mv]# alias mv
alias mv='mv -i'
[root@MineGi /test/mv]#
命令示例:2. 将指定文件移动到指定目录中,保留文件原始名称
mkdir dir1
ls
mv file1 dir1/
ls
ls dir1/
输出结果:
[root@MineGi /test/mv]# mkdir dir1
[root@MineGi /test/mv]# ls
dir1 file1 file2
[root@MineGi /test/mv]# mv file1 dir1/
[root@MineGi /test/mv]# ls
dir1 file2
[root@MineGi /test/mv]# ls dir1/
file1
[root@MineGi /test/mv]#
命令示例:3. 将指定目录移动到指定目录中,并定义新的目录名称
mkdir dir2
ls
ls dir1/
mv dir2 dir1/Newdir
ls
ls dir1/
输出结果:
[root@MineGi /test/mv]# mkdir dir2
[root@MineGi /test/mv]# ls
dir1 dir2 file2
[root@MineGi /test/mv]# ls dir1/
file1
[root@MineGi /test/mv]# mv dir2 dir1/Newdir
[root@MineGi /test/mv]# ls
dir1 file2
[root@MineGi /test/mv]# ls dir1/
file1 Newdir
[root@MineGi /test/mv]#
命令示例:4. 将指定目录中所有的文件都移动到当前工作目录中
ls
mkdir dir1/dir_mv{1..3}
cp dir1/file1 .
ls
ls dir1
mv dir1/* .
ls
输出结果:
[root@MineGi /test/mv]# ls
dir1 file2
[root@MineGi /test/mv]# mkdir dir1/dir_mv{1..3}
[root@MineGi /test/mv]# cp dir1/file1 .
[root@MineGi /test/mv]# ls
dir1 file1 file2
[root@MineGi /test/mv]# ls dir1
dir_mv1 dir_mv2 dir_mv3 file1 Newdir
[root@MineGi /test/mv]# mv dir1/* .
mv:是否覆盖"./file1"? y
[root@MineGi /test/mv]# ls
dir1 dir_mv1 dir_mv2 dir_mv3 file1 file2 Newdir
[root@MineGi /test/mv]#
命令示例:5. 移动多个文件或目录
mv Newdir/ dir_mv* file* dir1/
ls
ls dir1/
输出结果:
[root@MineGi /test/mv]# mv Newdir/ dir_mv* file* dir1/
mv:是否覆盖"dir1/file1"? y
[root@MineGi /test/mv]# ls
dir1 file1
[root@MineGi /test/mv]# ls dir1/
dir_mv1 dir_mv2 dir_mv3 file1 file2 Newdir
[root@MineGi /test/mv]#
命令示例:6. 将源文件和目标文件调换,移动文件到目录(-t参数)
cd dir1/
mv Newdir/ dir_mv11
mv dir_mv3/ dir_mv22
ls
mv dir_mv1 dir_mv2
mv -t dir_mv11/ dir_mv22
ls
ls dir_mv11/
ls dir_mv2/
输出结果:
[root@MineGi /test/mv]# cd dir1/
[root@MineGi /test/mv/dir1]# mv Newdir/ dir_mv11
[root@MineGi /test/mv/dir1]# mv dir_mv3/ dir_mv22
[root@MineGi /test/mv/dir1]# ls
dir_mv1 dir_mv11 dir_mv2 dir_mv22 file1 file2
[root@MineGi /test/mv/dir1]# mv dir_mv1 dir_mv2
[root@MineGi /test/mv/dir1]# mv -t dir_mv11/ dir_mv22
[root@MineGi /test/mv/dir1]# ls
dir_mv11 dir_mv2 file1 file2
[root@MineGi /test/mv/dir1]# ls dir_mv11/
dir_mv22
[root@MineGi /test/mv/dir1]# ls dir_mv2/
dir_mv1
[root@MineGi /test/mv/dir1]#
注意事项
- 当使用 mv 命令移动目录时,整个目录及其内容都会被移动。
- 如果目标目录不存在,mv 命令会尝试将其创建为新的目录,并将源文件或目录移动到这个新目录中。
- 如果目标文件或目录已经存在,并且没有使用 -i 选项,mv 命令会默默地覆盖它。因此,在使用 mv 命令时要特别小心,尤其是在处理重要文件时。
希望这些信息能帮助你更好地理解和使用 Linux 中的 mv 命令!
此外,还有一些额外的注意事项和技巧可以帮助你更有效地使用 mv 命令:
避免覆盖重要文件
如前文所述,mv 命令在覆盖目标文件或目录时不会进行任何警告。为了避免不小心覆盖重要文件,你应该始终在使用 mv 命令时保持谨慎,并确保你知道目标路径的内容。另外,使用 -i 选项是一个很好的习惯,它会在覆盖文件之前提示你进行确认。
使用通配符进行批量操作
你可以结合 shell 的通配符功能来使用 mv 命令,以便一次性移动或重命名多个文件。例如,mv *.txt newdir/ 将把所有扩展名为 .txt 的文件移动到 newdir 目录中。
移动多个文件或目录
你可以在同一 mv 命令中指定多个源文件或目录,然后指定一个目标目录。例如,mv file1.txt file2.txt dir1/ dir2/ newdir/ 将把 file1.txt、file2.txt、dir1/ 和 dir2/ 移动到 newdir/ 中。
跨文件系统移动
当你尝试在不同的文件系统之间移动文件或目录时,mv 命令实际上会执行一个复制和删除的操作,而不是真正的移动。这是因为不同的文件系统之间不能直接移动数据。在这种情况下,你应该确保目标文件系统有足够的空间来存储复制的数据。
权限问题
如果你没有足够的权限来移动或重命名文件或目录,mv 命令会失败并显示相应的错误信息。在这种情况下,你可能需要使用 sudo 命令来以超级用户身份执行 mv 命令,或者更改文件或目录的权限。
查看 mv 命令的手册页
要了解 mv 命令的更多细节和选项,你可以使用 man mv 命令来查看其手册页。手册页中包含了关于 mv 命令的详细描述、选项、示例和常见问题的解答。
通过熟悉 mv 命令的这些细节和技巧,你可以更加高效和安全地在 Linux 系统中移动和重命名文件和目录。无论你是在管理个人文件、配置系统环境,还是在进行软件开发和部署,mv 命令都是一个非常有用的工具。
此外,还有一些高级用法和技巧,能够进一步提升 mv 命令的使用效率和安全性。
首先,mv 命令也支持在移动或重命名文件和目录时,使用正则表达式进行匹配。通过正则表达式,你可以精确地匹配到特定的文件名或目录名,然后对其进行移动或重命名操作。这在你需要批量处理具有特定命名模式的文件或目录时非常有用。
其次,mv 命令还支持对目录进行递归操作。当你希望将一个目录下的所有文件和子目录都移动到另一个目录时,可以使用 -r 或 -R 选项,这将使 mv 命令递归地处理源目录下的所有内容。
另外,mv 命令也可以与 find 命令结合使用,实现更复杂的文件移动或重命名操作。通过 find 命令,你可以根据文件的类型、大小、修改时间等属性来查找文件,然后使用 mv 命令对这些文件进行移动或重命名。
最后,需要注意的是,尽管 mv 命令在 Linux 系统中非常强大和灵活,但在使用时仍需谨慎。特别是在进行批量操作或跨文件系统移动时,务必确保你知道目标路径的内容,并确认有足够的权限和磁盘空间来执行操作。此外,为了防止误操作导致的数据丢失,建议在执行 mv 命令之前先备份重要文件。
总的来说,mv 命令是一个强大且灵活的工具,掌握其用法和技巧可以帮助你更加高效和安全地管理 Linux 系统中的文件和目录。通过不断学习和实践,你可以充分发挥 mv 命令的潜力,提升你的系统管理能力。