`

linux学习——档案目录之cp,rm,mv

阅读更多
复制、删除与移动:cp, rm, mv
要复制档案,请使用cp(copy) 这个指令即可,不过,cp 这个指令的用途可多了,除了单纯的复制之
外,还可以建立连结档(就是快捷方式啦) ,比对两档案的新旧而予以更新,以及复制整个目录等等的功
能呢!至于移动目录与档案,则使用mv (move) ,这个指令也可以直接拿来作更名(rename) 的动作
!至于移除吗?那就是rm (remove) 这个指令啰~底下我们就先来瞧一瞧~

  cp (复制档案或目录)
[root@sky ~]# cp [-adfilprsu] 来源文件(source) 目标文件(destination)
[root@sky ~]# cp [options] source1 source2 source3 .... directory
选项不参数:
-a :相当于-pdr 的意忠,至于pdr 请参考下列说明;(常用)
-d :若来源文件为链接文件的属性(link file) ,则复制链接文件属性而非档案本身;
-f :为强制(force)的意忠,若目标档案已经存在且无法开启,则移除后再尝试一次;
-i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l :进行硬式连结(hard link)的连结档建立,而非复制档案本身;
-p :连同档案的属性一起复制过去,而非使用默认属性(备份常用) ;
-r :递归持续复制,用于目录的复制行为;(常用)
-s :复制成为符号链接文件(symbolic link) ,亦即【快捷方式】档案;
-u :若destination 比source 旧才更新destination  !

最后需要注意的,如果来源档有两个以上,则最后一个目的文件一定要是【目 录】才行!
复制(cp)这个指令是非常重要的,不同身份者执行这个指令会有不同的结果产生,尤其是那个-a, -p 的
选项,对于不同身份来说,差异则非常的大!底下的练习中,有的身份为root 有的身份为一般账号(在
我这里用vbird 这个账号) ,练习时请特别注意身份的差别喔!好!开始来做复制的练习不观察:

范例一:用root 身份,将家目录下的.bashrc 复制到/tmp 下,并更名为
bashrc
[root@sky ~]# cp ~/.bashrc /tmp/bashrc
[root@sky ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n <==n不覆盖,y 为覆盖

# 重复作两次动作,由于/tmp 底下已经存在bashrc 了,加上-i 选项后,则在覆盖前会询问使用者是否确定!可以按下n 或者y 来二次确认呢!

范例二:变换目录到/tmp ,并将/var/log/wtmp 复制到/tmp 且观察属性:
[root@sky ~]# cd /tmp
[root@sky tmp]# cp /var/log/wtmp . <==想要复制到当前目录,最后的.不要忘
[root@sky tmp]# ls -l /var/log/wtmp wtmp
  -rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
  -rw-r--r-- 1 root root 96384 Sep 24 14:06 wtmp

# 注意上面的特殊字体,在不加任何选项的情况下,档案的某些属性/权限会改变;这是个很重要的特性!要注意喔!还有,连档案建立的时间也不一样了!
那如果你想要将档案的所有特性都一起复制过来该忟怎么办?可以加上-a 喔!如下所示:
[root@sky tmp]# cp -a /var/log/wtmp wtmp_2
[root@sky tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 wtmp_2
# 看到了吧!整个资料特性完全一模一样!相当不错吧~这就是-a 的特性!

这个cp 的功能很多,由于我们常常会进行一些数据的复制,所以也会常常用到这个指令的。一般来
说,我们如果去复制别人的数据(当然,该档案你必须要有read 的权限才行啊!^_^) 时,总是希望
复制到的数据最后是我们自己的,所以,在预设的条件中,cp 的来源档与目的档的权限是不同的,目
的档的拥有者通常会是指令操作者本身。丼例来说,上面的范例二中,由于我是root 的身份,因此复
制过来的档案拥有者与群组就改变成为root 所有了!这样说,可以明白吗?^_^

由于具有这个特性,因此当我们在进行备份的时候,某些需要特别注意的特殊权限档案,例如密码文
件(/etc/shadow) 以及一些配置文件,就不能直接以cp 来复制,而必须要加上-a 或者是-p 等等可以
完整复制档案权限的选项才行!另外,如果你想要复制档案给其他的使用者,也必须要注意到档案的
权限(包括读、写、执行以及档案拥有者等等) ,否则,其他人还是无法针对你给予的档案进行修订的动
作喔!注意注意!

范例三:复制/etc/ 这个目录下的所有内容到/tmp 底下
[root@sky tmp]# cp /etc/ /tmp
cp: omitting directory `/etc' <== 如果是目录则不能直接复制,要加上-r 的选项
[root@sky tmp]# cp -r /etc/ /tmp
# 还是要再次的强调喔!-r 是可以复制目录,但是,档案不目录的权限可能会被改变所以,也可以利用『cp -a /etc /tmp 』来下达指令喔!尤其是在备份的情况下!

范例四:将范例一复制的bashrc 建立一个连结档(symbolic link)

[root@sky tmp]# ls -l bashrc
-rw-r--r-- 1 root root 176 Sep 24 14:02 bashrc <==先观察一下档案情况
[root@sky tmp]# cp -s bashrc bashrc_slink
[root@sky tmp]# cp -l bashrc bashrc_hlink
[root@sky tmp]# ls -l bashrc*
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc <==与源文件不太一样了!
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc_hlink
lrwxrwxrwx 1 root root 6 Sep 24 14:20 bashrc_slink -> bashrc

范例四可有趣了!使用-l 及-s 都会建立所谓的连结档(link file) ,但是这两种连结档即有不一样的情
况。这是忟么一回事啊?那个-l 就是所谓的实体链接(hard link) ,至于-s 则是符号链接(symbolic
link) ,简单来说,bashrc_slink 是一个【忚捷方式】,这个快捷方式会连结到bashrc 去!所以你会看
到档名右侧会有个指向(->)的符号!
至于bashrc_hlink 档案与bashrc 的属性与权限完全一模一样,与尚未进行连结前的差异则是第二栏的
link 数由1 变成2 了!

范例五:若~/.bashrc 比/tmp/bashrc 新才复制过来
[root@sky tmp]# cp -u ~/.bashrc /tmp/bashrc
# 这个-u 的特性,是在目标档案不来源档案有差异时,才会复制的。所以,比较常被用于【备份】的工作当中喔!^_^

范例六:将范例四造成的bashrc_slink 复制成为bashrc_slink_1 与 bashrc_slink_2

[root@sky tmp]# cp bashrc_slink bashrc_slink_1
[root@sky tmp]# cp -d bashrc_slink bashrc_slink_2
[root@sky tmp]# ls -l bashrc bashrc_slink*
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc
lrwxrwxrwx 1 root root 6 Sep 24 14:20 bashrc_slink -> bashrc
-rw-r--r-- 1 root root 176 Sep 24 14:32 bashrc_slink_1 <==不源文件相同
lrwxrwxrwx 1 root root 6 Sep 24 14:33 bashrc_slink_2 -> bashrc <==是连结档!
# 这个例子也是很有趣!原本复制的是连结档,但是即将连结档的实际档案复制过来了也就是说,如果没有加上任何选项时,cp 复制的是源文件,而非链接文件的属性!若要复制链接文件的属性,就得要使用-d 的选项了!如bashrc_slink_2 所示。

范例七:将家目录的.bashrc 及.bash_history 复制到/tmp 底下

[root@sky tmp]# cp ~/.bashrc ~/.bash_history /tmp
# 可以将多个数据一次复制到同一个目录去!最后面一定是目录!

rm (移除档案或目录)
[root@sky ~]# rm [-fir] 档案或目录
选项不参数:
-f :就是force 的意思,忽略不存在的档案,不会出现警告信息;
-i :互动模式,在删除前会询问使用者是否执行
-r :递归删除,最常用在目录的删除了!这是非常危险的选项!!!

范例一:将刚刚在cp 的范例中建立的bashrc 删除掉!
[root@sky ~]# cd /tmp
[root@sky tmp]# rm -i bashrc
rm: remove regular file `bashrc'? y
# 如果加上-i 的选项就会主动询问,避免你删除到错误的档案!

范例二:透过通配符*的帮助,将/tmp 底下开头为bashrc 的档名通通删除:
[root@sky tmp]# rm -i bashrc*
# 注意那个星号,代表的是0 到无穷多个任意字符喔!很好用的东西!

范例三:将cp 范例中所建立的/tmp/etc/ 这个目录删除掉!
[root@sky tmp]# rmdir /tmp/etc
rmdir: etc: Directory not empty <== 删不掉啊!因为这不是空的目录!
[root@sky tmp]# rm -r /tmp/etc
rm: descend into directory `/tmp/etc'? y
# 因为身份是root,预设已经加入了-i 的选项,所以你要一直按y 才会删除!如果不想要继续挄y ,可以按下【[ctrl]-c】来结束rm 的工作。这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做:
[root@sky tmp]# \rm -r /tmp/etc
# 在指令前加上反斜杠,可以忽略掉alias 的指定选项!

范例四:删除一个带有- 开头的档案
[root@sky tmp]# touch ./-aaa- <==touch 这个指令可以建立空档案!
[root@sky tmp]# ls -l
-rw-r--r-- 1 root root 0 Sep 24 15:03 -aaa- <==档案大小为0 ,所以是空档案
[root@sky tmp]# rm -aaa-
Try `rm --help' for more information. <== 因为"-" 是选项嘛!所以系统误判了!
[root@sky tmp]# rm ./-aaa-

这是移除的指令(remove) ,要注意的是,通常在Linux 系统下,为了怕档案被误杀,所以很多distributions 都已经默认加入-i 这个选项了!而如果要连目录下的东西都一起杀掉的话,例如子目录里面还有子目录时,那就要使用-r 这个选项了!不过,使用【rm -r 】这个指令之前,请千万要注意,因为该目录或档案【肯定】会被root 杀掉!因为系统不会再次询问你是否要砍掉哦!所以那是个超级严重的指令下达呦!得特别注意!不过,如果你确定该目录不要了,那么使用rm -r 来循环杀掉是不错的方式!另外,范例四也是很有趣的例子,我们在之前就谈过,档名最好不要使用"-" 号开头,因为"-" 后面接的是选项,因此,单纯的使用【 rm -aaa- 】系统的指令就会误判啦!那如果使用后面会谈到的正规表示法时,还是会出问题的!所以,叧能用避过首位字符是"-" 的方法啦!就是加上本目录【./ 】即可!如果man rm 的话,其实还有一种方法,那就是【rm -- -aaa- 】也可以哦!

mv (移动档案与目录,或更名)
[root@sky ~]# mv [-fiu] source destination
[root@sky ~]# mv [options] source1 source2 source3 .... directory
选项不参数:
-f :force 强制的意思,如果目标档案已经存在,不会询问而直接覆盖;
-i :若目标档案(destination) 已经存在时,就会询问是否覆盖!
-u :若目标档案已经存在,且source 比较新,才会更新(update)

范例一:复制一档案,建立一目录,将档案移动到目录中
[root@sky ~]# cd /tmp
[root@sky tmp]# cp ~/.bashrc bashrc
[root@sky tmp]# mkdir mvtest
[root@sky tmp]# mv bashrc mvtest
# 将某个档案移动到某个目录去,就是这样做!

范例二:将刚刚的目录名称更名为mvtest2
[root@sky tmp]# mv mvtest mvtest2 <== 这样就更名了
# 其实在Linux 底下还有个有趣的指令,名称为rename,该指令专职进行多个档名的同时更名,幵非针对单一档名变更,与mv 不同。

范例三:再建立两个档案,再全部移动到/tmp/mvtest2 当中
[root@sky tmp]# cp ~/.bashrc bashrc1
[root@sky tmp]# cp ~/.bashrc bashrc2
[root@sky tmp]# mv bashrc1 bashrc2 mvtest2
# 注意到这边,如果有多个来源档案或目录,则最后一个目标文件一定是【目 录】意思是说,将所有的数据移动到该目录的意思!这是搬移(move) 的意思!当你要移动档案或目录的时候,这个指令就很重要啦!同样的,你也可以使用-u ( update )来测试新旧档案,看看是否需要搬移啰!另外一个用途就是【变更档名】我们可以很轻易的使用mv 来变更一个档案的档名呢!不过,在Linux 的指令当中,有个rename ,可以用来更改大量档案的档名,你可以利用man rename 来查阅一下,也是挺有趣的指令喔!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics