跟老男孩学Linux运维:核心系统命令实战
上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命令。