从零开始的linux 第十八章
(窗外震耳的声音)“小编!快起床更新博客!”
(↑因为寒冷而缩成一团的小编)
(暴力女路人乙突然把门踹开):“死小编!这么冷的天,我们都在教室快冻成冰棍儿啦!你还不来讲课!....居然还没起床!”
别别别....我起..我起...马上就起床...五分钟...五分钟就好...w
...五分钟后...
(小编此时站在讲台上)呼~~在这寒风刺骨的天气,只有被子能给小编一丝丝温暖~~
呼~小编快冻死惹~~废话不多说啦~~小编赶紧讲完钻进被窝里~~这么冷的天气,同学们也要早点回去休息啦~~才不是因为小编要休息,小编辛苦一点没什么,可是不能苦了你们呀~~
那么,上一章小编跟同学们讲了一些查看类的命令,其中有两个很重要的命令忘记在标签中标记惹~~但是没关系,同学们知道就好~~具体讲的查看类命令是:more,less,head,tail。而cat命令小编在前几章也已经讲过了,对于现在,同学们对于文件系统有了一些了解,知道了创建删除查看等基本操作,那么还有复制和移动的操作小编没给同学们将,这一章,小编就讲一下复制和移动吧~~
小编就带同学们先来看看复制命令吧~:
cp:复制文件和目录
对于这个新命令,获得使用帮助,小编同样查看一下man文档~
从man文档中,可以看到 cp 复制命令有三种格式:
cp [option]...[-T] SOURCE(源文件) DEST(目标)
cp [option]...SOURCE... DIRECTORY(目录)
cp [option]...-t DIRECTORY SOURCE
为什么会有三种格式呢?这三种如何使用呢?
首先:
第一种:cp [option]...[-T] SOURCE(源文件) DEST(目标)
源文件是一个单个文件,用于单文件复制,称为单源复制.
第二种与第三种:cp [option]...SOURCE... DIRECTORY(目录)
cp [option]...-t DIRECTORY SOURCE
其复制的源文件有多个,因此称为多源复制
复制文件到目标时,分为两种情况,一种是目标文件存在,另一种是目标文件不存在;而存在时又分为目标究竟是文件还是目录呢?那么这几种情况,小编下面会详解的~~
对于 单源复制 来说:
如果DEST(目标)不存在,则会创建出一个与源文件同名的文件,并将源文件的数据流复制至这个文件中.(所谓数据流,即表示数据内容)。如:
小编现在/app/目录下没有任何内容
小编用 cp 命令,此时 /etc/passwd 文件即为源文件,而/app/目录为目标。很明显,这是目标存在的情况,而且目标是目录,若目标是目录的话,就会在这个目录下生成一个与该文件同名的新文件,并复制其数据流到新文件中。
当目标是一个非目录,而且这个目标存在:
若目标非目录且存在,会提示是否覆盖,当输入 y 确认后,文件名字还是原来的文件的名字,但是其中内容的确已经被替换。嗯....同学们若是不相信的话,小编这个 passwd 之前是从/etc/目录下复制过来的,可以给同学们看一下哦~~~
另一个文件就不需要看啦,这就已经可以证明文件内容以及被替换咯~~
那么,若目标不存在,也就是说,小编复制一个文件,而目标指向的那个文件不存在:
源是/etc/fstab文件,将该文件复制,目标为/app/zzc,但是,zzc这个文件原本来/app/目录下十不存在的,而实验结果是,当目标不存在,则会将该文件创建出来,文件名为自己指定的文件名,并将源文件的数据流(文件内容)复制进去。
以上是单元复制,下面,小编来说说多源复制:
多源复制,若目标不存在,将会报错。这里说的目标,指的是所有文件,包括目录,这里的不存在的意思是不指定目标:
小编没有指定目标,而提示的是删除目录,但实际上,目录依然存在
若目标存在,但是目标是非目录的文件,也会报错。因为我们不可能把多个文件合并到一个文件中,linux是没有这个功能的~~
所以,多源复制时,目标必须要是一个存在的目录
小编这个用法小编可能同学们会疑惑,但这是正确的用法哦~~多源复制,源可以指定多个,而最后一个目录即为目标,/app/这个目录必须是存在的~~文件复制过后,会保持原有的名字。
单元复制以及多源复制小编就介绍完毕,那么,cp 命令支持的选项也有很多,小编就介绍一下可能会用的到的吧~~因为一般复制文件时候基本用不到选项的~
-n:若文件存在,不覆盖
若不加 -n 的话,会提示小编是否覆盖,输入y确认后,内容将会改变,这里没有提示也没有改变内容~
-v:显示其复制过程
复制文件时,会显示源文件和生成的目标文件
-p:复制时权限不变
linux中,每个文件都有其所属人和所属组,所谓所属人,即表示这个文件属于哪个用户,而所属组表示这个文件属于哪个用户组,除了所属人和所属组之外,每个文件还有读(r)写(w)执行(x)权限,其较为复杂,小编这里就不多言啦~~等到讲权限的时候,小编会很耐心的跟同学们讲~~另外,用该命令,文件的时间戳也不会改变:
小编之前跟同学们讲过时间戳,相信同学们知道时间戳在哪里看~~那么,小编把这个当成源文件,将这个文件复制一份并加上 -p 选项:
可以看出两张图基本没什么差别,但还是有那么一点细微的变化的~~
-i:交互式复制,即覆盖文件时提示用户是否覆盖
这个选项相信不需要小编来解释了,同学们也看到,小编上面在覆盖文件的时候,没有加 -i 选项为什么也提示小编是否覆盖文件呢??提问~路人甲~~
路人甲:“唉??因为...有命令别名”
回答正确
这么做也是为了防止我们误操作,不小心把一些重要的文件给覆盖掉~~
-f:强制覆盖目标文件
当目标文件无法读取写入时(或没有权限对其操作),将其原来的目标文件删除,并创建一个同名的文件将内容写入到新建的文件中。
为了演示这个,小编先把/app/目录下的shadow文件复制到zzc用户的家目录下,但是该文件除了root用户,其他任何用户都是不能对这个文件操作的~~因为zzc用户在/app/目录下没有创建文件和删除文件的权限,所以小编暂时把他复制到zzc的家目录
然后,小编切换到zzc用户,切换用户,小编在很久很久以前就讲过咯,可不要忘记~~
小编在家目录下创建一个文件,将其复制,并将其目标指定成shadow文件,嗯...这算是单源复制
可以看到,小编无法直接对shadow文件进行操作
唉??居然没报错,那小编来看看shadow中的内容:
嗯,果然内容为空。因为小编创建的111文件内容为空,而zzc用户本身无法对shadow文件进行操作,自然无法覆盖该文件,但若加上 -f 选项,会把原本的 shadow 这个目标文件删除,并再创建一个新的文件,这个新文件的文件名与原来文件名字相同,也叫 shadow,但其中的内容以及被源给覆盖~~
-r 和 -R:递归复制.即复制目录时将其目录下的子目录中的内容一同复制到目标位置
小编在/app/目录下创建两个目录,并在其中一个目录中再创建一个目录,再在这个子目录中再创建一个文件:
其目录结构:
小编要将/app/xxx/目录下的所有内容都复制到/app/zzc/目录下,小编先不加 -r 或 -R 选项
直接复制将会报错
小编加上 -r 或 -R 后,将会把/app/xxx/目录下的所有内容,包括子目录中的内容一起复制到目标目录~
-d:复制链接文件时,仅复制符号链接本身,而不是复制其指向的源文件,但是复制后的链接文件依然会链接到源文件,若不加,则会复制符号链接所指向的源文件
这个选项,同学们对符号链接(软链接)和硬链接并不理解,小编这里就不演示这个选项啦~~等小编给同学们将了软链接和硬链接后,同学们就会明白什么意思~~
-a:相当于-dpR --preserve=all,用于实现归档(备份)。该选项会保留文件的所有属性.而该选项保留的属性包括 --preserve="vlue" 的所有属性内容
--preserve="vlue"其vlue可以为:
mode:权限
ownership:属主和属组
timestamps:时间戳
context:安全标签
xattr:扩展属性
links:符号链接
all:上述所有
嗯,小编讲的很容易理解~~这么晚啦~~小编就不一个一个演示啦~以上就是linux中cp命令复制文件
已经深夜了,同学们也困了,小编也好累~~这一章就到这里吧~~移动文件,小编等到下一章就给同学们介绍~~~