首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >章节2:基本的Linux命令,【cp】 命令的实用示例

章节2:基本的Linux命令,【cp】 命令的实用示例

作者头像
用户12454170
发布2026-05-06 18:57:37
发布2026-05-06 18:57:37
470
举报

在 Linux 的浩瀚宇宙中,文件操作是每位探索者的必备技能。前文中,我们解锁了删除目录的rmdir移动文件的mv 等多个神器。现在,让我们点亮技能树的另外一颗明珠——文件复制大师 cp

无论是备份关键配置,还是迁移项目数据,cp 命令都是你最可靠的数字搬运工。但你是否知道: 🔸 它能创建防误删的智能备份链? 🔸 它能保留文件原始属性与时间戳? 🔸 它甚至能用硬链接节省 90% 磁盘空间?

本文将通过 14 个实战案例,带你从基础复制到高阶技巧。

Cp 命令语法

cp 命令的语法与其他 Linux 命令相同。它分为两个部分--选项参数

代码语言:javascript
复制
cp [OPTIONS] <SOURCE> <DEST>
cp [OPTIONS] <SOURCE-1> <SOURCE-2> ... <DIRECTORY>

在上诉语法中,方括号[]代表可选参数,尖空号<>为必选参数。

1. 复制文件

cp 命令的基本用法之一是将文件复制到当前目录。大多数情况下,用户执行此操作是为了备份重要配置。例如,我们经常在更新 SSH 配置前创建 /etc/ssh/sshd_config 文件的备份副本。

为了了解其用法,让我们创建一个简单的文件:

代码语言:javascript
复制
touch file1.txt

使用以下命令创建文件副本:

代码语言:javascript
复制
cp file1.txt file2.txt

2. 显示详细信息

在上个示例中,使用 ls 命令来验证文件复制操作是否成功。不过,如果只是为了验证前几条命令的结果而多用一条命令,就没有意义了。

在这种情况下,我们可以使用 -v 选项来启用 "verbose "模式,它可以为每个处理过的文件提供诊断信息。

让我们使用以下命令复制 file1.txt 文件:

代码语言:javascript
复制
cp -v file1.txt file3.txt

在上述输出中,箭头代表正在复制的文件。左边的参数是源文件,右边的参数是目标文件。

3. 将多个文件复制到目录中

到目前为止,我们只处理了单个文件和当前工作目录。但在实际生产环境中,我们必须处理大量文件。在这种环境下,常见的用例之一就是将多个文件复制到一个目录中。显然,我们可以多次执行 cp 命令来实现这一目的,但这并不是最有效的方法。要有效地执行这样的操作,我们可以使用 cp 命令的另一种语法。

因此,首先创建一个新目录,名称为 dir1:

代码语言:javascript
复制
mkdir dir1

用一条命令将所有三个文件复制到 dir1 目录中:

代码语言:javascript
复制
cp -v file1.txt file2.txt file3.txt dir1

上述输出显示,所有文件都已复制到 dir1 目录。 此外,需要注意的是,要使用这种替代语法,目录必须已经存在,而且必须是命令的最后一个参数。

4. 如何避免覆盖文件

默认情况下,cp 命令会替换目标文件,这意味着如果目标文件中存在同名文件,它将覆盖该文件。不过,我们可以使用 -n 选项禁用这一默认行为。

为了理解这一点,让我们尝试覆盖现有文件:

代码语言:javascript
复制
cp -n -v file1.txt file2.txt

在示例中,使用 -v 选项来说明 file2.txt 文件未被覆盖。

5. 确认是否覆盖文件

在上一个示例中,演示了如何避免覆盖目标文件。不过,有时我们希望以更安全的方式覆盖目标文件。在这种情况下,我们可以使用命令的 -i 选项使复制操作具有交互性。该选项会显示警告信息,并在覆盖文件前等待用户确认。

为了说明这一点,让我们尝试覆盖现有文件:

代码语言:javascript
复制
cp -i file1.txt file2.txt

我们可以看到,命令正在等待确认。就像其他 Linux 命令一样,我们可以使用 "y "继续,或者使用 "n "中止操作。

cp 命令的这种默认非交互行为并不安全。用户有可能会错误地覆盖重要的配置。因此,一些 Linux 发行版会使用别名命令来强制执行默认的交互行为:

代码语言:javascript
复制
alias cp="cp -i"

6. 仅在源文件更新时覆盖(重写)文件

在前面的示例中,我们看到了如何使用交互模式。不过,有时用户可能会无意中覆盖较新的文件。为了避免这种容易出错的情况,我们可以使用 -u 选项,只有当源文件比目标文件新或目标文件不存在时,才尝试复制操作。

首先,更新源文件的时间戳:

代码语言:javascript
复制
touch -t 202507010910 file1.txt
ls -l file1.txt

在上诉命令中,我们使用 touch 命令的 -t 选项将文件的时间戳设置为 2025 年 07 月 1 日。

接下来,我们把目标文件的时间戳更新为当前时间:

代码语言:javascript
复制
touch file2.txt

使用 -u 选项执行复制操作:

代码语言:javascript
复制
cp -u -v file1.txt file2.txt

在这里,我们可以看到复制操作没有尝试,因为目标文件比源文件新。

最后,让我们交换源文件和目标文件的参数并执行复制操作:

代码语言:javascript
复制
cp -u -v file2.txt file1.txt

在图中,我们可以看到复制操作成功,因为源文件比目标文件新。

7. 在覆盖前备份文件

我们可以指示 cp 命令在覆盖目标文件前对其进行备份。为此,我们可以使用 --backup 选项来执行自动备份。

代码语言:javascript
复制
cp --backup=numbered -v file1.txt file2.txt

在示例中,我们使用了编号备份策略。该策略在备份文件名中使用增量数字。

为了理解这一点,让我们多次执行同一命令并观察输出结果:

代码语言:javascript
复制
cp --backup=numbered -v file1.txt file2.txt
cp --backup=numbered -v file1.txt file2.txt
cp --backup=numbered -v file1.txt file2.txt

8. 强制复制覆盖文件

在前面几个示例中,我们看到了如何以更安全的方式覆盖文件。但是,在某些罕见的情况下,需要覆盖文件。但是,并不能保证每次操作都能成功。

例如,如果目标文件没有写权限,复制操作就会失败。下面我们举例说明。

首先,更改目标文件的权限:

代码语言:javascript
复制
chmod 444 file2.txt
ls -l file2.txt

尝试覆盖 file2.txt 文件:

代码语言:javascript
复制
cp file1.txt file2.txt

在上述输出中,我们可以看到该命令因权限拒绝错误而失败。为了克服这一限制,我们可以使用 -f 选项,它可以删除目标文件,并在目标文件无法打开时尝试进行复制操作。

可以使用 -f 选项强行覆盖文件:

代码语言:javascript
复制
cp -f -v file1.txt file2.txt

9. 在复制前删除目标文件

有时需要先删除目标文件,然后再执行复制操作。为了满足这种要求,我们可以使用 --remove-destination 选项。

代码语言:javascript
复制
cp --remove-destination -v file1.txt file2.txt

在上面输出中,我们可以看到 cp 命令首先删除了目标文件,然后执行了复制操作。

10. 创建硬链接文件而不是复制

我们可以创建硬链接,而不是创建新的源文件副本。当磁盘空间不足时,这个选项就会发挥重要作用。

因此,让我们使用 -l 选项来创建硬链接:

代码语言:javascript
复制
cp -l -v file1.txt file4.txt

检查两个文件的 inode 编号,以验证硬链接:

代码语言:javascript
复制
ls -i1 file1.txt file4.txt

在上述输出中,第一列中的数字代表 inode 编号。

11. 创建软链接文件而不是复制

同样,我们也可以使用 -s 选项创建软链接,而不是创建新副本,如下所示:

代码语言:javascript
复制
cp -s -v file1.txt file5.txt
代码语言:javascript
复制

验证符号链接是否已正确创建:

代码语言:javascript
复制
ls -l file5.txt
代码语言:javascript
复制

在上面的输出中,最后一列表示符号链接关系。

12. 在复制时保留文件属性

文件有各种相关属性,如访问时间、修改时间、权限等。默认情况下,复制文件时不会保留这些属性。要覆盖这一默认行为,我们可以使用 -p 选项。

要理解这一点,首先要更新文件-1.txt 的时间戳:

代码语言:javascript
复制
touch -t 202507011010 file1.txt

让我们创建该文件的副本,保留其所有属性:

代码语言:javascript
复制
cp -p -v file1.txt file6.txt

最后,验证 file6.txt 文件的时间戳:

代码语言:javascript
复制
ls -l file6.txt

13. 递归执行复制操作

我们已经了解了如何复制单个文件。不过,很多时候我们需要复制特定目录下的所有文件和子目录。在这种情况下,我们可以使用 -r 或 -R 选项来使用递归模式。

因此,让我们创建一个目录,并在其下添加一些文件和子目录:

代码语言:javascript
复制
mkdir -p dir1/dir2
touch dir1/file1.txt dir1/dir2/file2.txt

验证目录结构是否已正确创建:

代码语言:javascript
复制
tree dir1

使用以下命令递归复制目录 dir1:

代码语言:javascript
复制
cp -r -v dir1 dir3

确认所有文件和子目录都已成功复制:

代码语言:javascript
复制
tree dir3

14. 如何复制多个目录

与文件类似,我们也可以使用一条命令递归复制多个目录。不过,要做到这一点,目标目录必须已经存在,而且必须是命令中的最后一个参数。让我们通过一个例子来理解这一点。

首先,创建一个新目录:

代码语言:javascript
复制
mkdir dir4

使用下面的命令将 dir1 和 dir3 目录复制到 dir4 目录中:

代码语言:javascript
复制
cp -r -v dir1 dir3 dir4

同样,我们也可以使用该命令的 -t 选项来达到同样的效果。该选项允许我们指定目标目录。因此,我们也可以将其作为第一个参数使用:

代码语言:javascript
复制
cp -t dir4 -r -v dir1 dir3
结语:

通过本文的14个实用示例,相信你已经全面掌握了 cp 命令的强大功能。作为 Linux 文件管理的核心工具,cp 不仅是简单的复制命令,更是数据安全的守护者高效操作的加速器。记住它的黄金法则:

"复制即备份,安全第一条"

🔑 关键技巧回顾

  • 使用 -i 避免误覆盖
  • 通过 --backup 自动保留历史版本
  • 递归复制用 -r 处理文件夹
  • 硬链接 -l 节省磁盘空间
  • -p 保留文件原始属性
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一根头发丝的宽度 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Cp 命令语法
    • 结语:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档