小惠 2011-09-07
复制、删除与移动:cp,rm,mv
要复制档案,请使用cp(copy)这个指令即可,不过,cp这个指令的用途可多了,除了单纯的复制之
外,还可以建立连结档(就是快捷方式啦),比对两档案的新旧而予以更新,以及复制整个目录等等的功
能呢!至于移动目录与档案,则使用mv(move),这个指令也可以直接拿来作更名(rename)的动作
!至于移除吗?那就是rm(remove)这个指令啰~底下我们就先来瞧一瞧~
cp(复制档案或目录)
[root@sky~]#cp[-adfilprsu]来源文件(source)目标文件(destination)
[root@sky~]#cp[options]source1source2source3....directory
选项不参数:
-a:相当于-pdr的意忠,至于pdr请参考下列说明;(常用)
-d:若来源文件为链接文件的属性(linkfile),则复制链接文件属性而非档案本身;
-f:为强制(force)的意忠,若目标档案已经存在且无法开启,则移除后再尝试一次;
-i:若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l:进行硬式连结(hardlink)的连结档建立,而非复制档案本身;
-p:连同档案的属性一起复制过去,而非使用默认属性(备份常用);
-r:递归持续复制,用于目录的复制行为;(常用)
-s:复制成为符号链接文件(symboliclink),亦即【快捷方式】档案;
-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@skytmp]#cp/var/log/wtmp.<==想要复制到当前目录,最后的.不要忘
[root@skytmp]#ls-l/var/log/wtmpwtmp
-rw-rw-r--1rootutmp96384Sep2411:54/var/log/wtmp
-rw-r--r--1rootroot96384Sep2414:06wtmp
#注意上面的特殊字体,在不加任何选项的情况下,档案的某些属性/权限会改变;这是个很重要的特性!要注意喔!还有,连档案建立的时间也不一样了!
那如果你想要将档案的所有特性都一起复制过来该忟怎么办?可以加上-a喔!如下所示:
[root@skytmp]#cp-a/var/log/wtmpwtmp_2
[root@skytmp]#ls-l/var/log/wtmpwtmp_2
-rw-rw-r--1rootutmp96384Sep2411:54/var/log/wtmp
-rw-rw-r--1rootutmp96384Sep2411:54wtmp_2
#看到了吧!整个资料特性完全一模一样!相当不错吧~这就是-a的特性!
这个cp的功能很多,由于我们常常会进行一些数据的复制,所以也会常常用到这个指令的。一般来
说,我们如果去复制别人的数据(当然,该档案你必须要有read的权限才行啊!^_^)时,总是希望
复制到的数据最后是我们自己的,所以,在预设的条件中,cp的来源档与目的档的权限是不同的,目
的档的拥有者通常会是指令操作者本身。丼例来说,上面的范例二中,由于我是root的身份,因此复
制过来的档案拥有者与群组就改变成为root所有了!这样说,可以明白吗?^_^
由于具有这个特性,因此当我们在进行备份的时候,某些需要特别注意的特殊权限档案,例如密码文
件(/etc/shadow)以及一些配置文件,就不能直接以cp来复制,而必须要加上-a或者是-p等等可以
完整复制档案权限的选项才行!另外,如果你想要复制档案给其他的使用者,也必须要注意到档案的
权限(包括读、写、执行以及档案拥有者等等),否则,其他人还是无法针对你给予的档案进行修订的动
作喔!注意注意!
范例三:复制/etc/这个目录下的所有内容到/tmp底下
[root@skytmp]#cp/etc//tmp
cp:omittingdirectory`/etc'<==如果是目录则不能直接复制,要加上-r的选项
[root@skytmp]#cp-r/etc//tmp
#还是要再次的强调喔!-r是可以复制目录,但是,档案不目录的权限可能会被改变所以,也可以利用『cp-a/etc/tmp』来下达指令喔!尤其是在备份的情况下!
范例四:将范例一复制的bashrc建立一个连结档(symboliclink)
[root@skytmp]#ls-lbashrc
-rw-r--r--1rootroot176Sep2414:02bashrc<==先观察一下档案情况
[root@skytmp]#cp-sbashrcbashrc_slink
[root@skytmp]#cp-lbashrcbashrc_hlink
[root@skytmp]#ls-lbashrc*
-rw-r--r--2rootroot176Sep2414:02bashrc<==与源文件不太一样了!
-rw-r--r--2rootroot176Sep2414:02bashrc_hlink
lrwxrwxrwx1rootroot6Sep2414:20bashrc_slink->bashrc
范例四可有趣了!使用-l及-s都会建立所谓的连结档(linkfile),但是这两种连结档即有不一样的情
况。这是忟么一回事啊?那个-l就是所谓的实体链接(hardlink),至于-s则是符号链接(symbolic
link),简单来说,bashrc_slink是一个【忚捷方式】,这个快捷方式会连结到bashrc去!所以你会看
到档名右侧会有个指向(->)的符号!
至于bashrc_hlink档案与bashrc的属性与权限完全一模一样,与尚未进行连结前的差异则是第二栏的
link数由1变成2了!
范例五:若~/.bashrc比/tmp/bashrc新才复制过来
[root@skytmp]#cp-u~/.bashrc/tmp/bashrc
#这个-u的特性,是在目标档案不来源档案有差异时,才会复制的。所以,比较常被用于【备份】的工作当中喔!^_^
范例六:将范例四造成的bashrc_slink复制成为bashrc_slink_1与bashrc_slink_2
[root@skytmp]#cpbashrc_slinkbashrc_slink_1
[root@skytmp]#cp-dbashrc_slinkbashrc_slink_2
[root@skytmp]#ls-lbashrcbashrc_slink*
-rw-r--r--2rootroot176Sep2414:02bashrc
lrwxrwxrwx1rootroot6Sep2414:20bashrc_slink->bashrc
-rw-r--r--1rootroot176Sep2414:32bashrc_slink_1<==不源文件相同
lrwxrwxrwx1rootroot6Sep2414:33bashrc_slink_2->bashrc<==是连结档!
#这个例子也是很有趣!原本复制的是连结档,但是即将连结档的实际档案复制过来了也就是说,如果没有加上任何选项时,cp复制的是源文件,而非链接文件的属性!若要复制链接文件的属性,就得要使用-d的选项了!如bashrc_slink_2所示。
范例七:将家目录的.bashrc及.bash_history复制到/tmp底下
[root@skytmp]#cp~/.bashrc~/.bash_history/tmp
#可以将多个数据一次复制到同一个目录去!最后面一定是目录!
rm(移除档案或目录)
[root@sky~]#rm[-fir]档案或目录
选项不参数:
-f:就是force的意思,忽略不存在的档案,不会出现警告信息;
-i:互动模式,在删除前会询问使用者是否执行
-r:递归删除,最常用在目录的删除了!这是非常危险的选项!!!
范例一:将刚刚在cp的范例中建立的bashrc删除掉!
[root@sky~]#cd/tmp
[root@skytmp]#rm-ibashrc
rm:removeregularfile`bashrc'?y
#如果加上-i的选项就会主动询问,避免你删除到错误的档案!
范例二:透过通配符*的帮助,将/tmp底下开头为bashrc的档名通通删除:
[root@skytmp]#rm-ibashrc*
#注意那个星号,代表的是0到无穷多个任意字符喔!很好用的东西!
范例三:将cp范例中所建立的/tmp/etc/这个目录删除掉!
[root@skytmp]#rmdir/tmp/etc
rmdir:etc:Directorynotempty<==删不掉啊!因为这不是空的目录!
[root@skytmp]#rm-r/tmp/etc
rm:descendintodirectory`/tmp/etc'?y
#因为身份是root,预设已经加入了-i的选项,所以你要一直按y才会删除!如果不想要继续挄y,可以按下【[ctrl]-c】来结束rm的工作。这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做:
[root@skytmp]#\rm-r/tmp/etc
#在指令前加上反斜杠,可以忽略掉alias的指定选项!
范例四:删除一个带有-开头的档案
[root@skytmp]#touch./-aaa-<==touch这个指令可以建立空档案!
[root@skytmp]#ls-l
-rw-r--r--1rootroot0Sep2415:03-aaa-<==档案大小为0,所以是空档案
[root@skytmp]#rm-aaa-
Try`rm--help'formoreinformation.<==因为"-"是选项嘛!所以系统误判了!
[root@skytmp]#rm./-aaa-
这是移除的指令(remove),要注意的是,通常在Linux系统下,为了怕档案被误杀,所以很多distributions都已经默认加入-i这个选项了!而如果要连目录下的东西都一起杀掉的话,例如子目录里面还有子目录时,那就要使用-r这个选项了!不过,使用【rm-r】这个指令之前,请千万要注意,因为该目录或档案【肯定】会被root杀掉!因为系统不会再次询问你是否要砍掉哦!所以那是个超级严重的指令下达呦!得特别注意!不过,如果你确定该目录不要了,那么使用rm-r来循环杀掉是不错的方式!另外,范例四也是很有趣的例子,我们在之前就谈过,档名最好不要使用"-"号开头,因为"-"后面接的是选项,因此,单纯的使用【rm-aaa-】系统的指令就会误判啦!那如果使用后面会谈到的正规表示法时,还是会出问题的!所以,叧能用避过首位字符是"-"的方法啦!就是加上本目录【./】即可!如果manrm的话,其实还有一种方法,那就是【rm---aaa-】也可以哦!
mv(移动档案与目录,或更名)
[root@sky~]#mv[-fiu]sourcedestination
[root@sky~]#mv[options]source1source2source3....directory
选项不参数:
-f:force强制的意思,如果目标档案已经存在,不会询问而直接覆盖;
-i:若目标档案(destination)已经存在时,就会询问是否覆盖!
-u:若目标档案已经存在,且source比较新,才会更新(update)
范例一:复制一档案,建立一目录,将档案移动到目录中
[root@sky~]#cd/tmp
[root@skytmp]#cp~/.bashrcbashrc
[root@skytmp]#mkdirmvtest
[root@skytmp]#mvbashrcmvtest
#将某个档案移动到某个目录去,就是这样做!
范例二:将刚刚的目录名称更名为mvtest2
[root@skytmp]#mvmvtestmvtest2<==这样就更名了
#其实在Linux底下还有个有趣的指令,名称为rename,该指令专职进行多个档名的同时更名,幵非针对单一档名变更,与mv不同。
范例三:再建立两个档案,再全部移动到/tmp/mvtest2当中
[root@skytmp]#cp~/.bashrcbashrc1
[root@skytmp]#cp~/.bashrcbashrc2
[root@skytmp]#mvbashrc1bashrc2mvtest2
#注意到这边,如果有多个来源档案或目录,则最后一个目标文件一定是【目录】意思是说,将所有的数据移动到该目录的意思!这是搬移(move)的意思!当你要移动档案或目录的时候,这个指令就很重要啦!同样的,你也可以使用-u(update)来测试新旧档案,看看是否需要搬移啰!另外一个用途就是【变更档名】我们可以很轻易的使用mv来变更一个档案的档名呢!不过,在Linux的指令当中,有个rename,可以用来更改大量档案的档名,你可以利用manrename来查阅一下,也是挺有趣的指令喔!