Linux 命令(文件和目录管理 - cp)

时间:2021-09-26 11:31:57

简述

cp 命令用来复制文件或目录。当复制多个文件时,目标文件参数必须为已经存在的目录。cp 命令默认不能复制目录,复制目录必须使用 -R 选项。

命令介绍

  • 命令名称
    cp

  • 命令全称
    copy

  • 基本语法
    cp [选项]… [-T] 源文件 目标文件
    或:cp [选项]… 源文件… 目录
    或:cp [选项]… -t 目录 源文件…

  • 功能描述
    将源文件复制至目标文件,或将多个源文件复制至目标目录。

命令选项

选项 说明
-a, --archive 等于-dR --preserve=all
--backup[=CONTROL] 为每个已存在的目标文件创建备份
-b 类似 --backup,但不接受参数
-d 等于--no-dereference --preserve=links
-f, --force 强行复制文件或目录,不论目标文件或目录是否已存在。
-i, --interactive 覆盖既有文件之前先询问用户
-l, --link 对源文件建立硬连接,而非复制文件。
-n, --no-clobber 不要覆盖已存在的文件(使前面的 -i 选项失效)
-P, --no-dereference 不跟随源文件中的符号链接
-p, --preserve 保留源文件或目录的属性(默认:模式、所有权、时间戳)
-R, -r, --recursive 递归复制目录及其子目录内的所有内容
-s, --symbolic-link 只创建符号链接而不复制文件
-S, --suffix=SUFFIX 自行指定备份文件的后缀
-t, --target-directory=DIRECTORY 将所有参数指定的源文件/目录复制至目标目录
-T, --no-target-directory 将目标目录视作普通文件
-u, --update 当目标文件不存在,或者源文件比目标文件新时,才执行复制操作。
-v, --verbose 显示详细的进行步骤
--help 在标准输出上显示帮助信息并退出
--version 在标准输出上显示版本信息并退出

使用范例

1.不带任何参数下,运行 cp

这是 cp 命令最基础的使用,将文件从一个位置到另一个位置。

[wang@localhost c++]$ ls *.c
hello.c
[wang@localhost c++]$ ls /home/wang/script/
[wang@localhost c++]$ cp hello.c /home/wang/script/
[wang@localhost c++]$ ls *.c
hello.c
[wang@localhost c++]$ ls /home/wang/script/
hello.c

注意:和 mv 命令不同的是:cp 拷贝后,原文件依然存在。

2.同时拷贝多个文件

要同时拷贝多个文件,只需要将多个文件用空格隔开。

[wang@localhost c++]$ ls /home/wang/script/
hello.c
[wang@localhost c++]$ cp qt5_cadaques.pdf qwt.pdf /home/wang/script/
[wang@localhost c++]$ ls /home/wang/script/
hello.c qt5_cadaques.pdf qwt.pdf

3.拷贝一个目录

要拷贝一个目录,需要添加 -r 或者 -R 选项来递归实现。

[wang@localhost doc]$ tree linux/
linux/
└── linux-program.pdf

0 directories, 1 file
[wang@localhost doc]$ tree /home/wang/script/
/home/wang/script/
├── hello.c
├── qt5_cadaques.pdf
└── qwt.pdf

0 directories, 3 files
[wang@localhost doc]$ cp -r linux/ /home/wang/script/
[wang@localhost doc]$ tree /home/wang/script/
/home/wang/script/
├── hello.c
├── linux
│ └── linux-program.pdf
├── qt5_cadaques.pdf
└── qwt.pdf

1 directory, 4 files

4.创建文件的硬链接,而不是拷贝

拷贝文件意味着必须使用一些存储空间来储存拷贝的文件。有时候出于某种原因,可能想要创建“快捷方式”或者链接到文件,而不是拷贝。要做到这一点,可以使用 -l 选项。

[wang@localhost doc]$ ls -lvi debug.log 
4243086 -rw-rw-r--. 1 wang wang 368640 930 16:23 debug.log
[wang@localhost doc]$ cp -l debug.log /home/wang/script/
[wang@localhost doc]$ ls -lvi /home/wang/script/debug.log
4243086 -rw-rw-r--. 2 wang wang 368640 930 16:23 /home/wang/script/debug.log

可以看出,我们看到 debug.log 的硬链接已经拷贝到 /home/wang/script/目录下,并标记有同样的 inode 4243086。

5.创建文件的符号链接

如果要创建软链接(符号链接),用 -s 选项来实现。

[wang@localhost doc]$ cp -s /home/wang/script/debug.log debug_link.log
[wang@localhost doc]$ ls -l debug_link.log
lrwxrwxrwx. 1 wang wang 27 1019 15:59 debug_link.log -> /home/wang/script/debug.log

注意:创建符号链接只能在当前目录下进行。

6.不随符号链接拷贝原文件

只拷贝符号链接文件,可以用 -P 选项来实现。当对符号链接使用 cp 命令,它会照原样拷贝它自身。

[wang@localhost doc]$ ls -l debug_link.log 
lrwxrwxrwx. 1 wang wang 27 1019 15:59 debug_link.log -> /home/wang/script/debug.log
[wang@localhost doc]$ cp -P debug_link.log debug_link2.log
[wang@localhost doc]$ ls -l debug_link2.log
lrwxrwxrwx. 1 wang wang 27 1019 16:06 debug_link2.log -> /home/wang/script/debug.log

显然,cp 命令照原样拷贝 debug_link.log 自身,文件类型仍然是一个符号链接。

7.随符号链接拷贝原文件

可以试一下 -L 选项。基本上,这个刚好与上面的 -P 选项相反。

[wang@localhost doc]$ ls -l debug_link.log 
lrwxrwxrwx. 1 wang wang 27 1019 15:59 debug_link.log -> /home/wang/script/debug.log
[wang@localhost doc]$ cp -L debug_link.log debug_link3.log
[wang@localhost doc]$ ls -l debug_link3.log
-rw-rw-r--. 1 wang wang 368640 1019 16:09 debug_link3.log

使用这个选项,拷贝的文件将会和 debug_link.log 原文件一样。可以从文件大小看出来。拷贝的文件有 368640 字节,而当 debug_link.log 作为符号链接时文件大小只有 27 字节。

8.文件归档

当拷贝一个目录时,会用 -r 或者 -R 选项。但是也可以用 -a 选项来归档文件。这样会创建文件和目录的准确套录,如果有的话也可以包括符号链接。

[wang@localhost ~]$ ls -l doc
总用量 360
drwxrwxr-x. 2 wang wang 57 1019 15:54 c++
lrwxrwxrwx. 1 wang wang 27 1019 15:59 debug_link.log -> /home/wang/script/debug.log
-rw-rw-r--. 1 wang wang 368640 1019 15:53 debug.log
drwxrwxr-x. 2 wang wang 30 1019 15:53 linux
[wang@localhost ~]$ cp -a doc /home/wang/program/
[wang@localhost ~]$ ls -l /home/wang/program/doc/
总用量 360
drwxrwxr-x. 2 wang wang 57 1019 15:54 c++
lrwxrwxrwx. 1 wang wang 27 1019 15:59 debug_link.log -> /home/wang/script/debug.log
-rw-rw-r--. 1 wang wang 368640 1019 15:53 debug.log
drwxrwxr-x. 2 wang wang 30 1019 15:53 linux

上列的命令会拷贝一个名为 doc 的目录到 /home/wang/program 目录下,debug_link.log 依然作为符号链接被复制。

9.显示详细的进行步骤

默认情况下,当拷贝成功时,仅会再次看到命令提示符。如果想了解在拷贝文件时都发生了什么,可以用 -v 选项。

[wang@localhost c++]$ cp -v *.pdf /home/wang/program/
"qt5_cadaques.pdf" -> "/home/wang/program/qt5_cadaques.pdf"
"qwt.pdf" -> "/home/wang/program/qwt.pdf"

10.使用交互模式

使用 -i 选项,启用交互模式,会询问是否覆盖目标目录下的文件。

[wang@localhost c++]$ cp -i qwt.pdf /home/wang/program/
cp:是否覆盖"/home/wang/program/qwt.pdf"y

11.创建备份文件

当目标目录已经含有同名文件,默认情况下 cp 命令会覆盖目标目录下的同名文件。使用 --backup 选项,cp 命令会为每一个现有的目标文件做一个备份。

[wang@localhost c++]$ cp -bv qwt.pdf /home/wang/program/
"qwt.pdf" -> "/home/wang/program/qwt.pdf" (备份:"/home/wang/program/qwt.pdf~")
[wang@localhost c++]$ ls -l /home/wang/program/
总用量 12400
drwxrwxr-x. 4 wang wang 65 10月 19 16:21 doc
-rw-r--r--. 1 wang wang 7484327 10月 19 16:27 qt5_cadaques.pdf
-rw-r--r--. 1 wang wang 2604948 10月 19 16:35 qwt.pdf
-rw-r--r--. 1 wang wang 2604948 10月 19 16:32 qwt.pdf~

目标目录下出现了名为 qwt.pdf 和 qwt.pdf~ 的文件,波浪符号(~)意味着文件是备份文件。从属性中可以看到,备份文件比 qwt.pdf 要旧。

12.只拷贝文件属性

选项 --attributes-only,顾名思义,只会拷贝文件名及其属性,不会拷贝任何数据。

[wang@localhost c++]$ cp --attributes-only hello.c hello_attr_only.c
[wang@localhost c++]$ ls -l hello*
-rw-rw-r--. 1 wang wang 0 10月 19 16:41 hello_attr_only.c
-rw-rw-r--. 1 wang wang 60 10月 19 15:53 hello.c

可以看出,原文件 hello.c 有 60 字节大小,拷贝的文件只有 0 字节大小,这是因为文件内容并没有拷贝。

13.强制拷贝

使用 -f 选项会强制进行拷贝操作。如果目标文件不能打开,可以用 -f 尝试。

[wang@localhost c++]$ cp -fv hello.c hello2.c
"hello.c" -> "hello2.c"