学而实习之 不亦乐乎

Linux 中使用 cp 命令(copy file) 复制文件

2022-10-01 16:38:48

Linux cp(英文全拼:copy file)命令主要用于复制文件或目录(将源文件复制至目标文件,或将多个源文件复制至目标目录)。

一、语法

cp [options] source dest

cp [options] source... directory

cp [选项]... -t directory source...

参数说明:

  • -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR的参数组合。
  • --backup[=CONTROL:为每个已存在的目标文件创建备份
  • -b:覆盖已存在的文件目标前将目标文件备份,类似--backup 但不接受参数
  • -d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录(复制时保留链接)。这里所说的符号链接相当于Windows系统中的快捷方式。等于--no-dereference --preserve=links。
  • -f, --force:强行复制文件或目录,不论目标文件或目录是否已存在(当 -n 选项存在时则不需再选此项)。
  • -H:跟随源文件中的命令行符号链接。
  • -i, --interactive:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。
  • -l, --link:对源文件建立硬连接,而非复制文件;。
  • -L, --dereference:总是跟随符号链接。
  • -n, --no-clobber:不要覆盖已存在的文件(使前面的 -i 选项失效)。
  • -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中(保留源文件或目录的属性)。等于--preserve=模式,所有权,时间戳。
  • --preserve[=属性列表:保持指定的属性(默认:模式,所有权,时间戳),如果可能保持附加属性:环境、链接、xattr 等
  • -P, --no-dereference:不跟随源文件中的符号链接。
  • -R, -r, --recursive:递归处理,将指定目录下的所有文件与子目录一并处理(即:如果给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件)。
  • -s:对源文件建立符号链接,而非复制文件;
  • -S:在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀。
  • -u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件;
  • -v:详细显示命令执行的操作。

二、实例

1、将文件a.txt 复制成文件b.txt

# touch a.txt
# cp a.txt b.txt
# ll
total 0
-rw-r--r-- 1 root root 0 Jun 21 19:59 a.txt
-rw-r--r-- 1 root root 0 Jun 21 19:59 b.txt

2、将文件a.txt复制成文件b.txt,显示详细信息 

# cp -v a.txt c.txt
‘a.txt’ -> ‘c.txt’

3、复制文件,只有源文件较目的文件的修改时间新时,才复制文件

# cp -uv a.txt d.txt
‘a.txt’ -> ‘d.txt’
# ll
-rw-r--r-- 1 root root 0 Jun 21 19:59 a.txt
-rw-r--r-- 1 root root 0 Jun 21 19:59 b.txt
-rw-r--r-- 1 root root 0 Jun 21 21:46 c.t
-rw-r--r-- 1 root root 0 Jun 21 21:47 c.txt
-rw-r--r-- 1 root root 0 Jun 21 21:48 d.txt

# cp -uv a.txt d.txt
# ll
total 0
-rw-r--r-- 1 root root 0 Jun 21 19:59 a.txt
-rw-r--r-- 1 root root 0 Jun 21 19:59 b.txt
-rw-r--r-- 1 root root 0 Jun 21 21:46 c.t
-rw-r--r-- 1 root root 0 Jun 21 21:47 c.txt
-rw-r--r-- 1 root root 0 Jun 21 21:48 d.txt

4、采用交互方式将文件a.txt复制成文件d.txt

# cp -i  a.txt e.txt
cp: overwrite ‘e.txt’? y

5、将文件a.txt复制成d.txt,因为目的文件已经存在,所以指定使用强制复制的模式 

# \cp -f a.txt e.txt

6、递归将目录dir1复制到目录dir2下面(此时dir2不存在)

# cp dir1 dir2
cp: omitting directory ‘dir1’
# cp -r dir1 dir2

7、复制时保留文件属性

# cp -p a.txt f.txt
# ll
total 8
-rw-r--r-- 1 root root    0 Jun 21 19:59 a.txt
-rw-r--r-- 1 root root    0 Jun 21 19:59 b.txt
-rw-r--r-- 1 root root    0 Jun 21 21:46 c.t
-rw-r--r-- 1 root root    0 Jun 21 21:47 c.txt
drwxr-xr-x 2 root root 4096 Jun 21 22:03 dir1
drwxr-xr-x 2 root root 4096 Jun 21 22:04 dir2
-rw-r--r-- 1 root root    0 Jun 21 21:48 d.txt
-rw-r--r-- 1 root root    0 Jun 21 21:59 e.txt
-rw-r--r-- 1 root root    0 Jun 21 19:59 f.txt

8、复制时产生备份文件(如果文件存在的话,会对之前的文件备份)

# cp -bv c.txt  /tmp/
cp: overwrite ‘/tmp/c.txt’? 
# cp -bv c.txt  /tmp/
cp: overwrite ‘/tmp/c.txt’? y
‘c.txt’ -> ‘/tmp/c.txt’ (backup: ‘/tmp/c.txt~’)

9、复制的 a.txt 建立一个连结档 a_link.txt

# cp -s a.txt a_link
lrwxrwxrwx 1 root root    5 Jun 21 22:25 a_link -> a.txt
-rw-r--r-- 1 root root    0 Jun 21 19:59 a.txt

10、不随符号链接拷贝原文件

# cp a_link.txt b_bink.txt
# ll
total 0
lrwxrwxrwx 1 root root 5 Jun 21 22:32 a_link.txt -> a.txt
-rw-r--r-- 1 root root 0 Jun 21 22:31 a.txt
-rw-r--r-- 1 root root 0 Jun 21 22:32 b_bink.txt

# cp -P a_link.txt c_bink.txt
# ll
total 0
lrwxrwxrwx 1 root root 5 Jun 21 22:32 a_link.txt -> a.txt
-rw-r--r-- 1 root root 0 Jun 21 22:31 a.txt
-rw-r--r-- 1 root root 0 Jun 21 22:32 b_bink.txt
lrwxrwxrwx 1 root root 5 Jun 21 22:33 c_bink.txt -> a.txt

11、指定备份文件尾标

# cp -v -S _back a.txt /tmp/
cp: overwrite ‘/tmp/a.txt’? y
‘a.txt’ -> ‘/tmp/a.txt’ (backup: ‘/tmp/a.txt_back’) 
#默认情况
# cp -bv  a.txt /tmp/
cp: overwrite ‘/tmp/a.txt’? y
‘a.txt’ -> ‘/tmp/a.txt’ (backup: ‘/tmp/a.txt~’)