在 Linux 的浩瀚宇宙中,文件操作是每位探索者的必备技能。前文中,我们解锁了删除目录的rmdir 和移动文件的mv 等多个神器。现在,让我们点亮技能树的另外一颗明珠——文件复制大师 cp!
无论是备份关键配置,还是迁移项目数据,cp 命令都是你最可靠的数字搬运工。但你是否知道:
🔸 它能创建防误删的智能备份链?
🔸 它能保留文件原始属性与时间戳?
🔸 它甚至能用硬链接节省 90% 磁盘空间?
本文将通过 14 个实战案例,带你从基础复制到高阶技巧。
cp 命令的语法与其他 Linux 命令相同。它分为两个部分--选项和参数:
cp [OPTIONS] <SOURCE> <DEST>
cp [OPTIONS] <SOURCE-1> <SOURCE-2> ... <DIRECTORY>

在上诉语法中,方括号[]代表可选参数,尖空号<>为必选参数。
1. 复制文件
cp 命令的基本用法之一是将文件复制到当前目录。大多数情况下,用户执行此操作是为了备份重要配置。例如,我们经常在更新 SSH 配置前创建 /etc/ssh/sshd_config 文件的备份副本。
为了了解其用法,让我们创建一个简单的文件:
touch file1.txt
使用以下命令创建文件副本:
cp file1.txt file2.txt
2. 显示详细信息
在上个示例中,使用 ls 命令来验证文件复制操作是否成功。不过,如果只是为了验证前几条命令的结果而多用一条命令,就没有意义了。
在这种情况下,我们可以使用 -v 选项来启用 "verbose "模式,它可以为每个处理过的文件提供诊断信息。
让我们使用以下命令复制 file1.txt 文件:
cp -v file1.txt file3.txt
在上述输出中,箭头代表正在复制的文件。左边的参数是源文件,右边的参数是目标文件。
3. 将多个文件复制到目录中
到目前为止,我们只处理了单个文件和当前工作目录。但在实际生产环境中,我们必须处理大量文件。在这种环境下,常见的用例之一就是将多个文件复制到一个目录中。显然,我们可以多次执行 cp 命令来实现这一目的,但这并不是最有效的方法。要有效地执行这样的操作,我们可以使用 cp 命令的另一种语法。
因此,首先创建一个新目录,名称为 dir1:
mkdir dir1
用一条命令将所有三个文件复制到 dir1 目录中:
cp -v file1.txt file2.txt file3.txt dir1
上述输出显示,所有文件都已复制到 dir1 目录。 此外,需要注意的是,要使用这种替代语法,目录必须已经存在,而且必须是命令的最后一个参数。
4. 如何避免覆盖文件
默认情况下,cp 命令会替换目标文件,这意味着如果目标文件中存在同名文件,它将覆盖该文件。不过,我们可以使用 -n 选项禁用这一默认行为。
为了理解这一点,让我们尝试覆盖现有文件:
cp -n -v file1.txt file2.txt
在示例中,使用 -v 选项来说明 file2.txt 文件未被覆盖。
5. 确认是否覆盖文件
在上一个示例中,演示了如何避免覆盖目标文件。不过,有时我们希望以更安全的方式覆盖目标文件。在这种情况下,我们可以使用命令的 -i 选项使复制操作具有交互性。该选项会显示警告信息,并在覆盖文件前等待用户确认。
为了说明这一点,让我们尝试覆盖现有文件:
cp -i file1.txt file2.txt
我们可以看到,命令正在等待确认。就像其他 Linux 命令一样,我们可以使用 "y "继续,或者使用 "n "中止操作。
cp 命令的这种默认非交互行为并不安全。用户有可能会错误地覆盖重要的配置。因此,一些 Linux 发行版会使用别名命令来强制执行默认的交互行为:
alias cp="cp -i"
6. 仅在源文件更新时覆盖(重写)文件
在前面的示例中,我们看到了如何使用交互模式。不过,有时用户可能会无意中覆盖较新的文件。为了避免这种容易出错的情况,我们可以使用 -u 选项,只有当源文件比目标文件新或目标文件不存在时,才尝试复制操作。
首先,更新源文件的时间戳:
touch -t 202507010910 file1.txt
ls -l file1.txt
在上诉命令中,我们使用 touch 命令的 -t 选项将文件的时间戳设置为 2025 年 07 月 1 日。
接下来,我们把目标文件的时间戳更新为当前时间:
touch file2.txt
使用 -u 选项执行复制操作:
cp -u -v file1.txt file2.txt
在这里,我们可以看到复制操作没有尝试,因为目标文件比源文件新。
最后,让我们交换源文件和目标文件的参数并执行复制操作:
cp -u -v file2.txt file1.txt
在图中,我们可以看到复制操作成功,因为源文件比目标文件新。
7. 在覆盖前备份文件
我们可以指示 cp 命令在覆盖目标文件前对其进行备份。为此,我们可以使用 --backup 选项来执行自动备份。
cp --backup=numbered -v file1.txt file2.txt
在示例中,我们使用了编号备份策略。该策略在备份文件名中使用增量数字。
为了理解这一点,让我们多次执行同一命令并观察输出结果:
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. 强制复制覆盖文件
在前面几个示例中,我们看到了如何以更安全的方式覆盖文件。但是,在某些罕见的情况下,需要覆盖文件。但是,并不能保证每次操作都能成功。
例如,如果目标文件没有写权限,复制操作就会失败。下面我们举例说明。
首先,更改目标文件的权限:
chmod 444 file2.txt
ls -l file2.txt
尝试覆盖 file2.txt 文件:
cp file1.txt file2.txt
在上述输出中,我们可以看到该命令因权限拒绝错误而失败。为了克服这一限制,我们可以使用 -f 选项,它可以删除目标文件,并在目标文件无法打开时尝试进行复制操作。
可以使用 -f 选项强行覆盖文件:
cp -f -v file1.txt file2.txt
9. 在复制前删除目标文件
有时需要先删除目标文件,然后再执行复制操作。为了满足这种要求,我们可以使用 --remove-destination 选项。
cp --remove-destination -v file1.txt file2.txt
在上面输出中,我们可以看到 cp 命令首先删除了目标文件,然后执行了复制操作。
10. 创建硬链接文件而不是复制
我们可以创建硬链接,而不是创建新的源文件副本。当磁盘空间不足时,这个选项就会发挥重要作用。
因此,让我们使用 -l 选项来创建硬链接:
cp -l -v file1.txt file4.txt
检查两个文件的 inode 编号,以验证硬链接:
ls -i1 file1.txt file4.txt
在上述输出中,第一列中的数字代表 inode 编号。
11. 创建软链接文件而不是复制
同样,我们也可以使用 -s 选项创建软链接,而不是创建新副本,如下所示:
cp -s -v file1.txt file5.txt
验证符号链接是否已正确创建:
ls -l file5.txt
在上面的输出中,最后一列表示符号链接关系。
12. 在复制时保留文件属性
文件有各种相关属性,如访问时间、修改时间、权限等。默认情况下,复制文件时不会保留这些属性。要覆盖这一默认行为,我们可以使用 -p 选项。
要理解这一点,首先要更新文件-1.txt 的时间戳:
touch -t 202507011010 file1.txt
让我们创建该文件的副本,保留其所有属性:
cp -p -v file1.txt file6.txt
最后,验证 file6.txt 文件的时间戳:
ls -l file6.txt
13. 递归执行复制操作
我们已经了解了如何复制单个文件。不过,很多时候我们需要复制特定目录下的所有文件和子目录。在这种情况下,我们可以使用 -r 或 -R 选项来使用递归模式。
因此,让我们创建一个目录,并在其下添加一些文件和子目录:
mkdir -p dir1/dir2
touch dir1/file1.txt dir1/dir2/file2.txt
验证目录结构是否已正确创建:
tree dir1
使用以下命令递归复制目录 dir1:
cp -r -v dir1 dir3
确认所有文件和子目录都已成功复制:
tree dir3
14. 如何复制多个目录
与文件类似,我们也可以使用一条命令递归复制多个目录。不过,要做到这一点,目标目录必须已经存在,而且必须是命令中的最后一个参数。让我们通过一个例子来理解这一点。
首先,创建一个新目录:
mkdir dir4
使用下面的命令将 dir1 和 dir3 目录复制到 dir4 目录中:
cp -r -v dir1 dir3 dir4
同样,我们也可以使用该命令的 -t 选项来达到同样的效果。该选项允许我们指定目标目录。因此,我们也可以将其作为第一个参数使用:
cp -t dir4 -r -v dir1 dir3
通过本文的14个实用示例,相信你已经全面掌握了 cp 命令的强大功能。作为 Linux 文件管理的核心工具,cp 不仅是简单的复制命令,更是数据安全的守护者和高效操作的加速器。记住它的黄金法则:
"复制即备份,安全第一条"
🔑 关键技巧回顾
-i 避免误覆盖--backup 自动保留历史版本-r 处理文件夹-l 节省磁盘空间-p 保留文件原始属性