Linux 命令 & shell 脚本之01(cp命令)

2020-09-25  本文已影响0人  轻飘飘D

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
上一篇 下一篇

猜你喜欢

热点阅读