linux mv命令详解


mv为move的缩写,可以移动文件和目录,常用mv命令重命名一个文件或者目录,命令常用格式如下:
              root@initroot:~$ mv [-fiu] source destination
              root@initroot:~$ mv [options] source1 source2 source3 .... directory
            
选项与参数:
-f :为force的缩写,强制移动。如果目标文件已经存在,直接覆盖掉已经存在的文件而不给出询问提示;
-i :互动模式,若目标文件(destination)已经存在,会询问提示是否覆盖已存在文件;
-r :若目标文件已经存在,且source源文件比目标文件新,才会覆盖更新(update)已存在的文件
进入/tmp目录,将家目录下的.bashrc复制到到/tmp目录,复制文件名为bashrc, 然后在/tmp目录下创建一个新目录mvtost,将bashrc文件移动到新创建的目录中:
              root@initroot:~# cd /tmp
              root@initroot:/tmp# cp ~/.bashrc bashrc
              root@initroot:/tmp# mkdir mvtost
              root@initroot:/tmp# mv bashrc mvtost
            
突然发现新创建的目录名字写错了,不是mvtost,而应该是mvtest,只需要用mv重命名一下即可:
              root@initroot:~# mv mvtost mvtest
            
简单到有点怀疑是否正确的重命名了,可以用ls确认一下。
如果mv命令有多个源文件参数,那么最后一个目标文件必须是目录,意思是将多个源文件同时移动到目标目录中。 我们通过touch命令随便创建两个空文件,然后将这两个文件同时移动到mvtest目录中:
              root@initroot:~# touch justformvtest1
              root@initroot:~# touch justformvtest2
              root@initroot:~# mv justformvtest1 justformvtest2 mvtest
            
mv命令不仅可以用来移动文件,也可以用来重命名文件,也可以通过-u选项先判断文件是否更新在决定是否移动。 其实在Linux下还有个有趣的重命名命令,那就是rename,该命令专门进行多个文件名的同时重命名,并非针对单一文件名变更,可以用来同时更改大量文件的文件名。详细信息可以通过man rename查看。

mv是move的缩写,用于移动文件和目录,该命令也可用来重命名文件或者目录。

Usage: mv [OPTION]... [-T] SOURCE DEST
or:
mv [OPTION]... SOURCE... DIRECTORY
or:
mv [OPTION]... -t DIRECTORY SOURCE...
Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.
Mandatory arguments to long options are mandatory for short options too.
--backup[=CONTROL] make a backup of each existing destination file
-b like --backup but does not accept an argument
-f, --force do not prompt before overwriting
-i, --interactive prompt before overwrite
-n, --no-clobber do not overwrite an existing file If you specify more than one of -i, -f, -n, only the final one takes effect.
--strip-trailing-slashes remove any trailing slashes from each SOURCE argument
-S, --suffix=SUFFIX override the usual backup suffix
-t, --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY
-T, --no-target-directory treat DEST as a normal file
-u, --update move only when the SOURCE file is newer than the destination file or when the destination file is missing
-v, --verbose explain what is being done
-Z, --context set SELinux security context of destination file to default type
--help display this help and exit
--version output version information and exit

The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.
The version control method may be selected via the --backup option or through
the VERSION_CONTROL environment variable. Here are the values:

none, off never make backups (even if --backup is given)
numbered, t make numbered backups
existing, nil numbered if numbered backups exist, simple otherwise
simple, never always make simple backups

GNU coreutils online help: http://www.gnu.org/software/coreutils/ Full documentation at:
http://www.gnu.org/software/coreutils/mv or available locally via: info '(coreutils) mv invocation'

linux文件总结

6.6 极重要的复习!权限与指令间的关系
我们知道权限对于使用者账号来说是非常重要的,因为他可以限制使用者能不能读取/建立/删除/修改 文件或目录! 在这一章我们介绍了很多文件系统的管理指令,第五章则介绍了很多文件权限的意义。 在这个小节当中, 我们就将这两者结合起来,说明一下什么指令在什么样的权限下才能够运作吧!
^_^ 一、让用户能进入某目录成为『可工作目录』的基本权限为何:
可使用的指令:例如 cd 等变换工作目录的指令;
目录所需权限:用户对这个目录至少需要具有 x 的权限
额外需求:如果用户想要在这个目录内利用 ls 查阅文件名,则用户对此目录还需要 r 的权限。二、用户在某个目录内读取一个文件的基本权限为何?
可使用的指令:例如本章谈到的 cat, more, less 等等
目录所需权限:用户对这个目录至少需要具有 x 权限;
文件所需权限:使用者对文件至少需要具有 r 的权限才行!
三、让使用者可以修改一个文件的基本权限为何?
可使用的指令:例如 nano 或未来要介绍的 vi 编辑器等;
目录所需权限:用户在该文件所在的目录至少要有 x 权限;
文件所需权限:使用者对该文件至少要有 r, w 权限
四、让一个使用者可以建立一个文件的基本权限为何?
目录所需权限:用户在该目录要具有 w,x 的权限,重点在 w 啦!
五、让用户进入某目录并执行该目录下的某个指令之基本权限为何?
目录所需权限:用户在该目录至少要有 x 的权限;
文件所需权限:使用者在该文件至少需要有 x 的权限
例题:
让一个使用者 peter 能够进行『cp /dir1/file1 /dir2』的指令时,请说明 dir1, file1, dir2 的最小所需权限为何?
答:
执行 cp 时, peter 要『能够读取来源文件,并且写入目标文件! 』所以应参考上述第二点与第四点的说明! 因此各 文件/目录的最小权限应该是:
dir1 :至少需要有 x 权限;
file1:至少需要有 r 权限;
dir2 :至少需要有 w, x 权限。
例题:
有一个文件全名为 /home/student/www/index.html ,各相关文件/目录的权限如下:
drwxr-xr-x 23 root
root
4096 Sep 22 12:09 /
drwxr-xr-x 6 root
root
4096 Sep 29 02:21 /home
drwx------ 6 student student 4096 Sep 29 02:23 /home/student
drwxr-xr-x 6 student student 4096 Sep 29 02:24 /home/student/www
-rwxr--r-- 6 student student
369 Sep 29 02:27 /home/student/www/index.html
请问 vbird 这个账号(不属于 student 群组)能否读取 index.html 这个文件呢?
答:
虽然 www 与 index.html 是可以让 vbird 读取的权限,但是因为目录结构是由根目录一层一层读取的, 因此 vbird 可 进入 /home 但是却不可进入 /home/student/ ,既然连进入 /home/student 都不许了, 当然就读不到 index.html 了! 所以答案是『vbird 不会读取到 index.html 的内容』喔!
那要如何修改权限呢?其实只要将 /home/student 的权限修改为最小 711 ,或者直接给予 755 就可以啰! 这可是很 重要的概念喔!
本章总结
绝对路径:
『一定由根目录 / 写起』 ;相对路径:
『不由 / 写起,而是由相对当前目录写起』
特殊目录有:., .., -, ~, ~account 需要注意;
与目录相关的指令有:cd, mkdir, rmdir, pwd 等重要指令;
rmdir 仅能删除空目录,要删除非空目录需使用『 rm -r 』指令;
用户能使用的指令是依据 PATH 变量所规定的目录去搜寻的;
ls 可以检视文件的属性,尤其 -d, -a, -l 等选项特别重要!
文件的复制、删除、移动可以分别使用:cp, rm , mv 等指令来操作;
检查文件的内容(读文件)可使用的指令包括有:cat, tac, nl, more, less, head, tail, od 等
cat -n 与 nl 均可显示行号,但默认的情况下,空白行会不会编号并不相同;
touch 的目的在修改文件的时间参数,但亦可用来建立空文件;
一个文件记录的时间参数有三种,分别是 access time(atime), status time (ctime), modification time(mtime),ls 默认显示的是 mtime。
除了传统的 rwx 权限之外,在 Ext2/Ext3/Ext4/xfs 文件系统中,还可以使用 chattr 与 lsattr 设定及观察隐藏属 性。 常见的包括只能新增数据的 +a 与完全不能更动文件的 +i 属性。
新建文件/目录时,新文件的预设权限使用 umask 来规范。默认目录完全权限为 drwxrwxrwx, 文件则为 -rw-rw-rw-。
文件具有 SUID 的特殊权限时,代表当用户执行此一 binary 程序时,在执行过程中用户会暂时具有程序拥有 者的权限
目录具有 SGID 的特殊权限时,代表用户在这个目录底下新建的文件之群组都会与该目录的组名相同。
目录具有 SBIT 的特殊权限时,代表在该目录下用户建立的文件只有自己与 root 能够删除!
观察文件的类型可以使用 file 指令来观察;
搜寻指令的完整文件名可用 which 或 type ,这两个指令都是透过 PATH 变量来搜寻文件名;
搜寻文件的完整档名可以使用 whereis 找特定目录或 locate 到数据库去搜寻,而不实际搜寻文件系统;
利用 find 可以加入许多选项来直接查询文件系统,以获得自己想要知道的档名。
6.8 本章习题:
( 要看答案请将鼠标移动到『答:
』底下的空白处,按下左键圈选空白处即可察看 ) 情境模拟题一:假设系统中有两个账号,分别是 alex 与 arod ,这两个人除了自己群组之外还共同支持一个名为 project 的群组。假设这两个用户需要共同拥有 /srv/ahome/ 目录的开发权,且该目录不许其他人进入查阅。 请问 该目录的权限设定应为何?请先以传统权限说明,再以 SGID 的功能解析。
目标:了解到为何项目开发时,目录最好需要设定 SGID 的权限!
前提:多个账号支持同一群组,且共同拥有目录的使用权!
需求:需要使用 root 的身份来进行 chmod, chgrp 等帮用户设定好他们的开发环境才行! 这也是管理员的 重要任务之一!
首先我们得要先制作出这两个账号的相关数据,账号/群组的管理在后续我们会介绍, 您这里先照着底下的指令来 制作即可:
[root@initroot ~]# groupadd project #增加新的群组
[root@initroot ~]# useradd -G project alex #建立 alex 账号,且支持 project
[root@initroot ~]# useradd -G project arod #建立 arod 账号,且支持 project #查阅 alex 账号的属性
[root@initroot ~]# id alex
uid=1001(alex) gid=1002(alex) groups=1002(alex),1001(project) #确实有支持!
[root@initroot ~]# id arod
uid=1002(arod) gid=1003(arod) groups=1003(arod),1001(project) #确实有支持!
然后开始来解决我们所需要的环境吧!
1. 首先建立所需要开发的项目目录:
[root@initroot ~]# mkdir /srv/ahome
[root@initroot ~]# ll -d /srv/ahome
drwxr-xr-x. 2 root root 6 Jun 17 00:22 /srv/ahome
2. 从上面的输出结果可发现 alex 与 arod 都不能在该目录内建立文件,因此需要进行权限与属性的修改。 由 于其他人均不可进入此目录,因此该目录的群组应为 project,权限应为 770 才合理。
[root@initroot ~]# chgrp project /srv/ahome
[root@initroot ~]# chmod 770 /srv/ahome
[root@initroot ~]# ll -d /srv/ahome
drwxrwx---. 2 root project 6 Jun 17 00:22 /srv/ahome
# 从上面的权限结果来看,由于 alex/arod 均支持 project,因此似乎没问题了!
3. 实际分别以两个使用者来测试看看,情况会是如何?先用 alex 建立文件,然后用 arod 去处理看看。
[root@initroot ~]# su - alex #先切换身份成为 alex 来处理
[alex@www ~]$ cd /srv/ahome #切换到群组的工作目录去
[alex@www ahome]$ touch abcd #建立一个空的文件出来!
[alex@www ahome]$ exit #离开 alex 的身份
[root@initroot ~]# su - arod
[arod@www ~]$ cd /srv/ahome
[arod@www ahome]$ ll abcd
-rw-rw-r--. 1 alex alex 0 Jun 17 00:23 abcd
# 仔细看一下上面的文件,由于群组是 alex ,arod 并不支持!
# 因此对于 abcd 这个文件来说, arod 应该只是其他人,只有 r 的权限而已啊!
[arod@www ahome]$ exit
由上面的结果我们可以知道,若单纯使用传统的 rwx 而已,则对刚刚 alex 建立的 abcd 这个文件来说, arod 可以删除他,但是却不能编辑他!这不是我们要的样子啊!赶紧来重新规划一下。
4. 加入 SGID 的权限在里面,并进行测试看看:
[root@initroot ~]# chmod 2770 /srv/ahome
[root@initroot ~]# ll -d /srv/ahome
drwxrws---. 2 root project 17 Jun 17 00:23 /srv/ahome
测试:使用 alex 去建立一个文件,并且查阅文件权限看看:
[root@initroot ~]# su - alex
[alex@www ~]$ cd /srv/ahome
[alex@www ahome]$ touch 1234
[alex@www ahome]$ ll 1234
-rw-rw-r--. 1 alex project 0 Jun 17 00:25 1234
# 没错!这才是我们要的样子!现在 alex, arod 建立的新文件所属群组都是 project, # 由于两人均属于此群组,加上 umask 都是 002,这样两人才可以互相修改对方的文件! 所以最终的结果显示,此目录的权限最好是『2770』 ,所属文件拥有者属于 root 即可,至于群组必须要为两 人共同支持的 project 这个群组才行!
简答题部分:
什么是绝对路径与相对路径
绝对路径的写法为由 / 开始写,至于相对路径则不由 / 开始写!此外,相对路径为相对于目前工作目录的路径!
如何更改一个目录的名称?例如由 /home/test 变为 /home/test2
mv /home/test /home/test2
PATH 这个环境变量的意义?
这个是用来指定执行文件执行的时候,指令搜寻的目录路径。
umask 有什么用处与优点?
umask 可以拿掉一些权限,因此,适当的定义 umask 有助于系统的安全, 因为他可以用来建立默认的目录或文件的权限。
当一个使用者的 umask 分别为 033 与 044 他所建立的文件与目录的权限为何?
在 umask 为 033 时,则预设是拿掉 group 与 other 的 w(2)x(1) 权限,因此权限就成为『文件 -rw-r--r-- , 目录 drwxr--r-- 』 而当 umask 044 时,则拿掉 r 的属性,因此就成为『文件 -rw--w--w-,目录 drwx-wx-wx』
什么是 SUID ?
当一个指令具有 SUID 的功能时,则:
o SUID 权限仅对二进制程序(binary program)有效;
o 执行者对于该程序需要具有 x 的可执行权限;
o 本权限仅在执行该程序的过程中有效 (run-time);
o 执行者将具有该程序拥有者 (owner) 的权限。
当我要查询 /usr/bin/passwd 这个文件的一些属性时(1)传统权限;(2)文件类型与(3)文件的隐藏属性,可以使 用什么指令来查询?
ls -al
file
lsattr
尝试用 find 找出目前 linux 系统中,所有具有 SUID 的文件有哪些?
find / -perm +4000 -print
找出 /etc 底下,文件大小介于 50K 到 60K 之间的文件,并且将权限完整的列出 (ls -l):
find /etc -size +50k -a -size -60k -exec ls -l {} \;
注意到 -a ,那个 -a 是 and 的意思,为符合两者才算成功
找出 /etc 底下,文件容量大于 50K 且文件所属人不是 root 的档名,且将权限完整的列出 (ls -l);
find /etc -size +50k -a ! -user root -exec ls -ld {} \;
find /etc -size +50k -a ! -user root -type f -exec ls -l {} \;
上面两式均可!注意到 ! ,那个 ! 代表的是反向选择,亦即『不是后面的项目』之意!
找出 /etc 底下,容量大于 1500K 以及容量等于 0 的文件:
find /etc -size +1500k -o -size 0
相对于 -a ,那个 -o 就是或 (or) 的意思啰!

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读