
上QQ阅读APP看书,第一时间看更新
2.7 cp:复制文件或目录
2.7.1 命令详解
【命令星级】 ★★★★★
【功能说明】
cp命令可以理解为英文单词copy的缩写,其功能为复制文件或目录。
【语法格式】
cp [option] [source] [dest] cp [选项] [源文件] [目标文件]
说明:
cp命令以及后面的选项和文件,每个元素之间都至少要有一个空格。
【选项说明】
表2-9针对该命令的参数选项进行了说明。
表2-9 cp命令的参数选项及说明

2.7.2 使用范例
1.基础范例
范例2-36:无参数和带参数-a的比较。
[root@oldboy test]# pwd /test [root@oldboy test]# ll -h #<==查看当前文件的时间属性,大家应以自己的为准。 total 12K drwxr-xr-x 3 root root 4.0K Nov 3 20:15 dir1 drwxr-xr-x 2 root root 4.0K Nov 3 20:15 dir2 drwxr-xr-x 2 root root 4.0K Nov 3 20:15 dir3 -rw-r--r-- 1 root root 0 Nov 3 20:14 file1.txt -rw-r--r-- 1 root root 0 Nov 3 20:14 file2.txt -rw-r--r-- 1 root root 0 Nov 3 20:14 file3.txt [root@oldboy test]# cp file1.txt file4.txt #<==复制file1.txt为file4.txt。 [root@oldboy test]# cp -a file1.txt file5.txt #<==使用-a参数复制file1.txt为file5. txt。 [root@oldboy test]# ll -h #<==再次查看当前文件的时间属性。 total 12K drwxr-xr-x 3 root root 4.0K Nov 3 20:15 dir1 drwxr-xr-x 2 root root 4.0K Nov 3 20:15 dir2 drwxr-xr-x 2 root root 4.0K Nov 3 20:15 dir3 -rw-r--r-- 1 root root 0 Nov 3 20:14 file1.txt #<==此行是源文件。 -rw-r--r-- 1 root root 0 Nov 3 20:14 file2.txt -rw-r--r-- 1 root root 0 Nov 3 20:14 file3.txt -rw-r--r-- 1 root root 0 Nov 3 20:18 file4.txt #<==此行是未使用任何参数。 -rw-r--r-- 1 root root 0 Nov 3 20:14 file5.txt #<==此行是使用-a参数复制 的,属性不变。
可以发现使用-a参数复制时,文件的时间属性没有改变,-a参数的功能包含-p参数保持文件的属性功能。
范例2-37:-i参数的例子。
[root@oldboy test]# cp -i file1.txt file5.txt #<==使用-i参数复制文件,会提示是否覆 盖文件。 cp: overwrite 'file5.txt'? [root@oldboy test]# cp file1.txt file5.txt #<==不使用-i参数一样的结果,为什 么呢? cp: overwrite 'file5.txt'? [root@oldboy test]# alias cp #<==原因是系统为cp命令默认设置了 别名。 alias cp='cp -i'
CentOS系统默认为cp命令设置了别名,即增加了-i的参数。但是在Shell脚本中执行cp时,若没有-i参数,则并不会询问是否覆盖。这是因为命令行和Shell脚本执行时的环境变量不同,不过在脚本中一般使用命令的全路径。
范例2-38:使用-r参数复制目录。
[root@oldboy test]# cp dir1 dir2/ #<==复制dir1到dir2,但结果显示跳过目录dir1。 cp: omitting directory 'dir1' [root@oldboy test]# cp -r dir1 dir2/ #<==若使用-r参数则复制成功。 [root@oldboy test]# tree dir2 #<==查看复制结果。 dir2 └── dir1 └── sub1 └── test 3 directories, 0 files #<==提示:使用-a参数也可以达到相同的效果,因为-a参数相当于“dpr”三个参数。
2.技巧性范例
范例2-39:cp覆盖文件之前不提示是否覆盖的几种方法。
解题思路:屏蔽系统默认的对应的命令别名。
第一种方法,使用命令全路径:
[root@oldboy test]# cp file1.txt file2.txt cp: overwrite 'file2.txt'? y #<==提示若输入y则确认覆盖,若输入n则不覆盖。 [root@oldboy test]# which cp #<==查看cp的系统别名。 alias cp='cp -i' /bin/cp [root@oldboy test]# /bin/cp file1.txt file2.txt #<==使用cp命令的绝对路径, 就可以屏蔽别名。
第二种方法,命令开头使用反斜线(\):
[root@oldboy test]# \cp file1.txt file2.txt #<==使用“\”屏蔽系统别名。 [root@oldboy test]#
第三种方法,取消cp的别名,但重启系统失效:
[root@oldboy test]# unalias cp #<==alias设置别名,unalias取消别名,具体用法请参见对应 章节。 [root@oldboy test]# cp file1.txt file2.txt [root@oldboy test]#
第四种为杀鸡取卵的方法,用于开拓思路,不建议采用:
[root@oldboy ~]# cat ~/.bashrc # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' #<==编辑这个文件,注释掉本行,重启也是生效的。在开机时会加载.bashrc这 个文件。 alias mv='mv -i' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi
范例2-40:快速备份文件案例。
我们备份文件通常使用如下所示的格式:
[root@oldboy ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.ori #<==但观察上面的格式,我们可以发现有一部分路径重复了。因此有了下面的快捷写法,使用了“{}”的用法,这两种方法是等效的。 [root@oldboy ~]# cp /etc/ssh/sshd_config{,.ori} #<==这种方法的原理是bash对大括号的展开操作,/etc/ssh/sshd_config{,.ori}展开成/etc/ssh/sshd_config /etc/ssh/sshd_config.ori再传给cp命令。