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

作者: 一去、二三里
个人微信号: iwaleon
微信公众号: 高效程序员

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 1019 16:21 doc
-rw-r--r--. 1 wang wang 7484327 1019 16:27 qt5_cadaques.pdf
-rw-r--r--. 1 wang wang 2604948 1019 16:35 qwt.pdf
-rw-r--r--. 1 wang wang 2604948 1019 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 1019 16:41 hello_attr_only.c
-rw-rw-r--. 1 wang wang 60 1019 15:53 hello.c

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

13.强制拷贝

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

[wang@localhost c++]$ cp -fv hello.c hello2.c
"hello.c" -> "hello2.c"
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一去丶二三里

有收获,再打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值