Linux cp命令主要用于复制文件或目录
1.语法
cp [options] source dest
or
cp [options] source... directory
2.参数说明
-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
-d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
-f:覆盖已经存在的目标文件而不给出提示。
-i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。
-p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
-l:不复制文件,只是生成链接文件
3.案例
3.1. cp 命令基本用法
#把源文件不改名复制到 mytestdir/ 目录下
[root@MYSQL8 ~]# mkdir mytestdir
[root@MYSQL8 ~]# touch testcp.txt
[root@MYSQL8 ~]# pwd
/root
[root@MYSQL8 ~]# cp testcp.txt /root/mytestdir/
[root@MYSQL8 ~]# cd mytestdir/
[root@MYSQL8 mytestdir]# ls
testcp.txt
#改名复制,则命令如下
[root@MYSQL8 ~]# pwd
/root
[root@MYSQL8 ~]# ls test*
testcp.txt
[root@MYSQL8 ~]# cp testcp.txt /root/mytestdir/testcp_new.txt
[root@MYSQL8 ~]# ls /root/mytestdir/testcp_new*
/root/mytestdir/testcp_new.txt
#复制的目标位置已经存在同名的文件,则会提示是否覆盖,因为 cp 命令默认执行的是“cp -i”的别名
[root@MYSQL8 ~]# pwd
/root
[root@MYSQL8 ~]# ls testcp*
testcp.txt
[root@MYSQL8 ~]# cp testcp.txt /root/mytestdir/
cp: overwrite ‘/root/mytestdir/testcp.txt’? yes
3.2 复制目录
[root@MYSQL8 ~]# pwd
/root
[root@MYSQL8 ~]# mkdir /root/dir1 -p
[root@MYSQL8 ~]# mkdir /root/dir1/subdir1 -p
[root@MYSQL8 ~]# touch /root/dir1/testcp2.txt
[root@MYSQL8 ~]# ls -R /root/dir1/
/root/dir1/:
subdir1 testcp2.txt
/root/dir1/subdir1:
[root@MYSQL8 ~]# mkdir /root/dir2 -p
[root@MYSQL8 ~]# cp -r /root/dir1/ /root/dir2/
[root@MYSQL8 ~]# ls -R /root/dir2/
/root/dir2/:
dir1
/root/dir2/dir1:
subdir1 testcp2.txt
/root/dir2/dir1/subdir1:
3.3 复制软链接文件
[root@MYSQL8 ~]# mkdir /root/source -p
[root@MYSQL8 ~]# touch /root/source/source_file.txt
[root@MYSQL8 ~]# mkdir /root/source_slink -p
##建立一个测试软链接文件 source_file_slink.txt
[root@MYSQL8 ~]# ln -s /root/source/source_file.txt /root/source_slink/source_file_slink.txt
[root@MYSQL8 ~]# ll /root/source_slink/s*
lrwxrwxrwx 1 root root 28 Sep 12 00:38 /root/source_slink/source_file_slink.txt -> /root/source/source_file.txt
#复制软链接文件,但是不加"-d"选项(实际复制的是 软链接的源文件,而不是软链接文件)
[root@MYSQL8 ~]# cp /root/source_slink/source_file_slink.txt /root/mytestdir/source_file_new.txt
[root@MYSQL8 ~]# ll /root/mytestdir/source_file_new*
-rw-r--r-- 1 root root 0 Sep 12 00:44 /root/mytestdir/source_file_new.txt
#复制软链接文件,加"-d"选项,则会复制软链接文件
[root@MYSQL8 ~]# cp -d /root/source_slink/source_file_slink.txt /root/mytestdir/source_file_slink_new.txt
[root@MYSQL8 ~]# ll /root/mytestdir/source_file_slink_new*
lrwxrwxrwx 1 root root 28 Sep 12 00:47 /root/mytestdir/source_file_slink_new.txt -> /root/source/source_file.txt
3.4. 保留源文件属性复制
#在执行复制命令后,目标文件的时间会变成复制命令的执行时间,而不是源文件的时间。例如
#注意源文件的时间和所属组
[root@MYSQL8 ~]# ll testcp.txt
-rw-r--r-- 1 root root 0 Sep 12 00:07 testcp.txt
[root@MYSQL8 ~]# cp testcp.txt /root/dir2/testcp_new2.txt
[root@MYSQL8 ~]# cp testcp.txt /root/dir2/
[root@MYSQL8 ~]# ll /root/dir2/testcp*
-rw-r--r-- 1 root root 0 Sep 12 21:45 /root/dir2/testcp_new2.txt
-rw-r--r-- 1 root root 0 Sep 12 21:46 /root/dir2/testcp.txt
#由于复制命令由root用户执行,所以目标文件的所属组为了root,而且时间也变成了复制命令的执行时间
#而当我们执行备份、曰志备份的时候,这些文件的时间可能是一个重要的参数,这就需执行 "-p" 选项了。
#这个选项会保留源文件的属性,包括所有者、所属组和时间。例如:
[root@MYSQL8 ~]# cp -p testcp.txt /root/dir2/testcp_new3.txt
[root@MYSQL8 ~]# ll /root/dir2/testcp_new3.txt
-rw-r--r-- 1 root root 0 Sep 12 00:07 /root/dir2/testcp_new3.txt
#源文件和目标文件的所有属性都一致,包括时间
#之前讲过,"-a" 选项相当于 "-d、-p、-r" 选项,这几个选项我们已经分别讲过了。
#所以,当我们使用 "-a" 选项时,目标文件和源文件的所有属性都一致,包括源文件的所有者,所属组、时间和软链接性。
#使用 "-a" 选项来取代 "-d、-p、-r" 选项更加方便。
3.5. "-l" 和 "-s" 选项
#如果使用 "-l" 选项,则目标文件会被建立为源文件的硬链接;而如果使用了 "-s" 选项,则目标文件会被建立为源文件的软链接。
#这两个选项和 "-d" 选项是不同的,"d" 选项要求源文件必须是软链接,目标文件才会复制为软链接;
#而 "-l" 和 "-s" 选项的源文件只需是普通文件,目标文件就可以直接复制为硬链接和软链接。例如:
[root@MYSQL8 ~]# mkdir /root/source_hlink -p
[root@MYSQL8 ~]# cd /root/source
[root@MYSQL8 source]# ll -i source_file.txt
51646850 -rw-r--r-- 1 root root 0 Sep 12 00:36 source_file.txt
[root@MYSQL8 source]# cp -s /root/source/source_file.txt /root/source_slink/source_file_slink2.txt
[root@MYSQL8 source]# cp -l /root/source/source_file.txt /root/source_hlink/source_file_hlink2.txt
[root@MYSQL8 source]# ll -i /root/source_slink/source_file_slink2.txt /root/source_hlink/source_file_hlink2.txt
51646850 -rw-r--r-- 2 root root 0 Sep 12 00:36 /root/source_hlink/source_file_hlink2.txt
594268 lrwxrwxrwx 1 root root 28 Sep 12 21:59 /root/source_slink/source_file_slink2.txt -> /root/source/source_file.txt
4.cat
[root@MYSQL8 ~]# cat testdata.txt
data1 100
data2 200
data3 300
data4 400
# -n参数会给所有的行加上行号
[root@MYSQL8 ~]# cat -n testdata.txt
1 data1 100
2
3 data2 200
4 data3 300
5
6 data4 400
#只想给有文本的行加上行号,可以用-b参数
[root@MYSQL8 ~]# cat -b testdata.txt
1 data1 100
2 data2 200
3 data3 300
4 data4 400
网友评论