Linux/Unix 中的 cp 命令 | Linux 复制文件

17 Mar 2025 | 6 分钟阅读

'cp' 表示复制。'cp' 命令用于复制文件或目录。

cp 命令简介

cp 命令用于复制目录和文件。该命令包含三种主要操作模式,通过展示给程序的参数类型来表示,用于将文件复制到其他文件,将多个文件复制到任何目录,或将整个目录复制到其他目录。

此外,该实用程序还接受多个命令行选项标志来详细说明已实现的操作。两个主要规范是 GNU cp 和 POSIX cp。GNU cp 包含比 POSIX 版本更多的选项。此外,该命令在 EFI shell 中可用。

cp 命令的操作系统模式

cp 命令包含三种主要操作系统模式。这些模式是通过程序调用时显示的参数的数量和类型来完成的。

  • 当程序包含两个指向文件的路径名参数时,程序可以将第一个文件的内容复制到第二个文件,并在必要时创建第二个文件。
  • 当程序包含一个或多个指向文件的路径名参数,然后在后面跟着一个指向目录的路径参数时,程序可以将所有源文件复制到目标目录,并在文件不存在时创建文件。
  • 当程序的参数是两个目录的路径名时,cp 命令可以复制源目录中的每个文件到目标目录,并在需要时创建任何目录或文件。此操作模式需要一个额外的选项标志来表示递归复制目录。源将被复制到目标,如果目标目录不存在,则创建一个新目录;如果目标目录已存在,则源将被复制到目标中。

cp 命令选项

选项描述
--archive, -a相当于 -dR --preserve=all。
--attributes-only不复制文件数据,只复制属性。
-b类似于 backup,但不接受任何参数。
--backup[=CONTROL]为所有现有目标文件创建备份。
--copy-contents递归时,复制特殊文件的内容。
-d相当于 --no-dereference --preserve=links。
--force, -f如果任何现有的目标文件无法打开,则删除它并重试(如果同时使用了 -n 标志,则会避免此选项)。
--interactive, -i在覆盖之前询问确认(覆盖之前的 -n 标志)。
-H在 SOURCE 中,跟随命令行符号链接。
--link, -l创建硬链接文件而不是复制。
--dereference, -L在 SOURCE 中,始终跟随符号链接。
--no-clobber, -n不覆盖任何现有文件(覆盖 -i 标志)。
--no-dereference, -P在 SOURCE 中,从不跟随符号链接。
-p相当于 --preserve=mode, timestamps, ownership。
--preserve[=ATTR_LIST]保留描述的属性。如果可能,附加属性:all, xattr, links, context。
--no-preserve=ATTR_LIST不保留描述的属性。
--parents在目录中,使用完整的源文件名。
--recursive, -r, -R递归复制目录。
--reflink[=WHEN]控制写时复制/克隆复制。
--remove-destination在尝试打开所有现有目标文件之前删除它们(与 --force 相反)。
--sparse=WHEN控制稀疏文件的创建。
--string-trailing-slashes从所有 SOURCE 参数中删除尾部斜杠。
--symbolic-link, -s创建符号链接而不是复制。
--suffix=SUFFIX, -S覆盖通用的备份后缀。
--target-directory=DIRECTORY, -t将每个 SOURCE 参数复制到 DIRECTORY。
--no-target-directory, -T将 DEST 视为普通文件。
--update, -u如果 SOURCE 文件比目标文件新,或者目标文件未指定,则复制。
--verbose, -v指定正在做什么。
--one-file-system, -x停留在文件系统上。
-Z将目标文件的 SELinux 安全上下文设置为默认类型。
--context[=CTX]与 -Z 相同,或者如果 CTX 被提及,则将 SMACK 或 SELinux 安全上下文设置为 CTX。
--help显示帮助菜单并退出。
--version提供版本详细信息并退出。

稀疏 SOURCE 文件通过廉价的启发式方法找到,并且相关的 DESR 文件默认创建为稀疏的。这是 --sparse=auto 所选择的行为。我们可以描述 --sparse=always 以在 SOURCE 文件包含足够长的零字节序列时创建稀疏的 DEST 文件。我们也可以应用 --sparse=never 来限制稀疏文件的创建。

如果提到了 --reflink[=always],则实现轻量级复制,其中数据块仅在更改时才被复制。如果不可能或提到了 --reflink=auto,则复制失败并回退到标准复制。我们也可以应用 --reflink=never 来保证实现标准复制。

要将文件复制到同一目录,语法如下:


Linux File cp

在上图的快照中,我们创建了 'docu' 的副本并命名为 'newdocu'。如果 <新文件名>(在本例中是 'newdocu')已经存在,则它将简单地覆盖先前的文件。

将文件复制到另一个目录

我们需要指定目标目录的路径。

在下面的快照中,之前不存在 'text' 文件。在给出命令后,'text' 文件已复制到目标目录 'Desktop'

Linux File cp

Linux cp -r

复制命令的 'r' 选项可用于将目录及其所有内容从源目录复制到目标目录。

语法

示例


linux cp -r

在上例中,我们将目录 'library' 复制到了目标目录 /home/sssit/Documents。这里,'library' 目录的所有内容(包括其内容)都被复制到了目标目录。

Linux 复制多个文件或目录

可以一次性将多个文件或目录复制到目标目录。在这种情况下,目标必须是一个目录。要复制多个文件,可以使用具有相同模式的 **通配符** (cp *.extension)。

语法

示例


Linux copy multiple files

在上例中,我们将扩展名相同的 '.txt' 文件(file1, file2, file3)复制到了 Documents 目录。

Linux cp --backup

如果要复制的文件已存在于目标目录中,可以使用此命令备份现有文件。

语法

示例


Linux file cp backup

如上所示,'file2.txt' 已存在于目标目录中。因此,我们创建了该文件的备份并将其复制到同一目录(具有相同名称)。

现在我们的目标目录 'Downloads' 中有两个同名文件(即 'file2.txt')。

Linux cp -i

cp '-i' 选项允许您在覆盖文件之前确认一次。

语法

示例


Linux cp -i

如您所见,它正在询问是否允许覆盖文件 'file3.txt',因为该文件已存在于目标目录中。现在,您可以按 y 覆盖文件,按 n 不覆盖文件。

Linux cp -l

如果要创建文件的硬链接而不是复制该文件,可以使用选项 'l'。

注意: 在创建文件的硬链接时,两个文件的 inode 号将保持不变。而在复制时,inode 号会改变。

语法

示例


Linux file cp -l

请注意,我们在 'usr' 中创建了文件 'file1.txt' 的硬链接。两个文件的 inode 号是相同的。

Linux cp -p

cp '-p' 选项用于保留文件的属性和元数据。您也可以保留您想要保留的选定属性。

语法

示例


Linux cp -p

现在,您可以匹配上图中的两个文件(原始文件和复制的文件),它们具有相同的属性。

Linux cp -u -v

当您想确保目标文件缺失或不存在时,使用 cp -u -v 命令。

语法

示例


Linux cp -u -v

在上图中,您可以看到有两个文件 'docc''file1.txt'。现在我们要将这两个文件复制到 'Download' 目录。但是我们不知道 'Downloads' 目录中是否已存在文件 'file1.txt'。

使用命令 'cp -u -v' 将自动处理已存在的文件(file1.txt),而不会覆盖它。

此命令对于复制大文件很有用。


下一个主题Linux mv 命令