Linux常用命令-mv

命令

mv

描述

move (rename) files
移动文件或目录,重命名

用法

1
2
3
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Options:
--backup[=CONTROL] 如果目标已存在则先创建一个备份文件,并指定备份文件名
-b 如果目标已存在则先创建一个备份文件
-f 如果目标文件已存在则强制覆盖
-i 如果目标文件已存在则提示
-n 如果目标文件已存在则跳过不要覆盖
-S 指定备份文件的后缀
-t 指定目标目录,用于同时移动多个源文件
-u 更新文件,即当源文件比目标文件新或者目标文件不存在时才移动
-v 显示详情
--strip-trailing-slashes 删除源文件最后的斜杠/

CONTROL:
off 不创建备份文件
t 自动创建数字格式的备份文件,每次创建备份时数字自动累加,格式如~1~,~2~
nil 如果已存在数字格式的备份文件则继续创建数字格式的文件,否则使用文件名加~
simple 备份文件使用文件名加~

注意

源和目标支持相对路径和绝对路径
源可以指定多个文件或目录,但是目标目录只能指定一个即最后一个目录将作为目标目录
在移动目录中的所有文件时,如果源目录中有隐藏文件则不会一起移动,需要单独移动
mv会保留源文件的所有属性

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# 重命名
$ echo aaa > a
$ mv a b
# 移动并重命名
$ echo aaa > a
$ mv a /tmp/b
# 移动多个文件和目录,最后一个目录d2为目标目录
$ touch a b
$ mkdir d1 d2
$ mv a b d1 d2

$ mkdir dir1
$ touch file1 file2
# 移动多个文件到目录,目标目录在后
$ mv file* dir1
# 或目标目录在前
$ mv -t dir1 file*
$ ls dir1
file1 file2

# 如果目标文件已存在,则会先删除目标文件,然后重命名源文件
$ echo aaa > a
$ echo bbb > b
$ mv a b
mv: overwrite 'b'? y
$ more b
aaa
$ ls
b

# -b备份文件,默认名称为文件名后加~
$ echo aaa > a
$ echo bbb > b
$ mv -b a b
mv: overwrite 'b'? y
$ ls
b b~
$ more b
aaa
$ more b~
bbb

# -S指定备份文件后缀.bak
$ echo aaa > a
$ echo bbb > b
$ mv -S .bak a b
mv: overwrite ‘b’? y
$ ls
b b~ b.bak
$ more b
aaa
$ more b.bak
bbb

# 指定备份文件名格式
$ echo aaa > a
$ echo bbb > b
$ ls
a b
$ mv -fv --backup=nil a b
‘a’ -> ‘b’ (backup: ‘b~’)
$ ls
b b~
$ echo aaa > a
# 指定为数字格式名称
$ mv -fv --backup=t a b
‘a’ -> ‘b’ (backup: ‘b.~1~’)
$ ls
b b~ b.~1~
# 自动累加
$ echo aaa > a
$ mv -fv --backup=t a b
‘a’ -> ‘b’ (backup: ‘b.~2~’)
# nil已存在数字格式文件则继续创建数字格式的备份文件
$ echo aaa > a
$ mv -fv --backup=nil a b
‘a’ -> ‘b’ (backup: ‘b.~3~’)

$ echo aaa > a
$ echo bbb > b
$ touch b
$ ll
-rw-r--r-- 1 root root 4 Feb 10 20:36 a
-rw-r--r-- 1 root root 4 Feb 10 20:37 b
# -u只更新文件,由于文件b的时间比a新,所以不会覆盖
$ mv -u a b
$ more b
bbb
# -n目标文件已存在则跳过
$ mv -n a b
$ more b
bbb
# 强制覆盖
$ mv -f a b
$ more b
aaa

# 移动目录时需要注意目录中的隐藏文件需要单独移动
$ mkdir dir1
$ mkdir dir2
$ echo a1 > dir1/a1
$ echo a2 > dir1/a2
$ echo b1 > dir2/b1
$ echo b2 > dir2/b2
$ tree
├── dir1
│   ├── a1
│   └── a2
└── dir2
├── b1
└── b2
# 默认移动目录是将源目录作为子目录移动到目标目录下
$ mv dir1 dir2
$ tree
└── dir2
├── b1
├── b2
└── dir1
├── a1
└── a2
# 还原
$ mv dir2/dir1 .
$ ls
dir1/ dir2/
# 创建隐藏文件
$ touch dir1/.aa
$ tree -a
├── dir1
│   ├── a1
│   ├── a2
│   └── .aa
└── dir2
├── b1
└── b2
# 移动源目录下的所有文件到目标目录中,但是隐藏文件将不会同步移动
$ mv dir1/* dir2
$ tree
├── dir1
│   └── .aa
└── dir2
├── a1
├── a2
├── b1
└── b2
# 隐藏文件需要单独移动
$ mv dir1/.aa dir2
$ tree -a
├── dir1
└── dir2
├── a1
├── a2
├── .aa
├── b1
└── b2