cp 命令

用途

将源文件的内容复制到目标文件。

语法

要将文件复制到另一个文件,请使用以下语法:
cp [ -d ] [ -e ] [ -E { force|ignore|warn } ] [ -f ] [ -h ] [ -i ] [ -p ] [ -I ] [ -S ] [ -U ] [ -- ] SourceFile TargetFile
要将文件复制到目录,请使用以下语法:
cp [ -d ] [ -e ] [ -E { force|ignore|warn } ] [ -f ] [ -h ] [ -i ] [ -p ] [ [ -r | -R ] [ -H | -L | -P ] ] [ -I ] [ -U ] [ -- ] SourceFile ... TargetDirectory
要将目录复制到目录,请使用以下语法:
cp [ -d ] [ -e ] [ -E { force|ignore|warn } ] [ -f ] [ -h ] [ -i ] [ -p ] { -r | -R } [ -H | -L | -P ] [ -I ] [ -U ] [ -- ] SourceDirectory ... TargetDirectory

描述

cp 命令将参数指定的源文件复制到目标文件。 SourceFile 参数指定的源文件复制到目标文件。 参数指定目标文件。 TargetFile 参数指定目标文件。 如果目标文件存在, cp 命令会覆盖文件内容,但不会更改与之相关的模式、所有者和组。 参数的最后访问时间 SourceFile 参数的最后访问时间和 TargetFile 参数的最后访问时间和最后修改时间均设置为复制完成的时间。 如果 TargetFile 参数不存在, cp 命令将创建一个以 TargetFile 参数命名的新文件。 参数 TargetFile 参数的模式与源文件相同,只是在超级用户设置之前不会设置粘性位。 超级用户是所有者,而 TargetFile 参数的组就是用户的组。 当 TargetFile 参数是指向另一个文件的链接时, cp 命令会用源文件的内容覆盖目标链接。 参数中的链接 TargetFile 参数中的链接仍然保留。 cp 命令会复制由 SourceFile 参数指定的源文件或 SourceDirectory 参数指定的目录中。 TargetDirectory 参数指定的目录。
注意: 如果源参数之一是目录,则必须指定 -r-R 标志。

在复制过程中,如果 cp 命令创建了一个目录,则新目录的模式与相应的源目录相同。

您可以使用 -R 标志复制特殊设备文件。 指定 -R 标志后,特殊文件将以新的路径名重新创建。 指定 -r 标志时, cp 命令会尝试将特殊文件复制到普通文件中。

注意: cp 命令生成的读写系统调用的 I/O 缓冲区大小是通过使用 AIX_STDBUFSZ 环境变量配置的。

标志

描述
-d 指定源文件以解密或明文格式存储在目标文件中。
-e 如果目标文件系统是加密文件系统 ( EFS ),则指定源文件以加密形式存储。
-E -E 选项需要以下参数之一:
force
如果无法保留文件的固定范围大小或空间预留,则文件复制操作失败。
ignore
忽略保存范围属性中的任何错误。
warn
如果文件的空间保留或者固定扩展数据块大小无法保存,就发出一个警告。
如果未指定 -E 标志,则默认使用警告参数。
-f 如果目标文件无法为写入操作打开,则指定删除该文件。 在 cp 命令执行复制操作之前,先移除目标文件。
-h 强制 cp 命令复制符号链接。 默认情况下是遵循符号链接。 符号文件要复制符号链接指向的文件。
-H 操作符指定的符号链接所引用文件的类型和内容。 SourceFile 操作符所引用的文件类型和内容。
-i 提示必须覆盖的文件名。 如果 TargetDirectoryTargetFile 参数中包含与 SourceFileSourceDirectory 参数中指定的文件同名,则会出现此提示。 如果输入 ycp 命令将继续执行。 任何其他的回答会避免 cp 命令覆盖文件。
-I 在转换访问控制列表 (ACL) 时抑制警告信息。
-L 根据作为参数操作数指定的任何符号链接或在遍历文件层次结构时遇到的符号链接所引用的文件类型和内容采取行动。 SourceFile 参数操作数或在遍历文件层次结构过程中遇到的符号链接所引用的文件类型和内容。
-p 复制每个 SourceFileSourceDirectory 在相应的 TargetFile 和/或目标目录中:
  • 最后修改数据和最后访问的时间。 如果复制因故失败, cp 命令会将诊断信息写入标准错误。 nanoseconds 字段的 SourceFileSourceDirectory 参数的字段不重复最后修改时间或最后访问时间。
  • 用户标识和组标识。 如果复制因故失败, cp 命令会将诊断信息写入标准错误。
  • 文件权限位以及 S_ISUIDS_ISGID 位。 如果复制因故失败, cp 命令会将诊断信息写入标准错误。

如果无法保留这些特征,则不会删除目标文件。

如果用户 ID 或组 ID 无法复制,文件权限 S_ISUIDS_ISGID 位将被清零。

用户必须拥有适当的文件访问权限,以保留所有者 ID 和组 ID、权限模式、修改和访问时间。 用户必须是超级用户,或者必须与目标文件的所有者 ID 相同。

如果目标文件系统支持与 SourceFile 参数关联的 ACL 会被保留(如果目标文件系统支持相同的 ACL)。 如果源文件包含网络文件系统 ( NFS4 ) ACL,而目标文件系统不支持 NFS4 ACL,则 NFS4 ACL 会转换为 AIX® Classic (AIXC) ACL 类型。

当 ACL 转换成功时,会在 stderr 文件(即标准错误输出文件)中打印警告信息。

如果源文件已加密并指定了 -p 标志, cp 命令将保留加密文件系统 ( EFS ) 信息。 通常,-e-d 标志优先于 -p 标志。 如果用户使用 -e 标志请求将明文文件转换为加密格式,即使用户指定了 -p 标志,副本也不会保留最后一次修改数据的时间和最后一次访问的时间等属性。 只要加密或解密状态保持不变, -p 标志就会保留文件属性和 EFS 信息。

-P 操作符指定的任何符号链接,或在遍历文件层次结构时遇到的任何符号链接。 SourceFile 操作符指定的任何符号链接,或在遍历文件层次结构时遇到的任何符号链接。
-r 指定的文件或目录下的文件层次结构。 SourceFileSourceDirectory 参数或递归复制指定的文件或目录下的文件层次。 -r 标志处理特殊文件的方式与处理普通文件类似。
-R 指定的目录中复制常规文件和目录下的文件层次结构。 SourceFileSourceDirectory 参数指定的目录下的文件层次复制到 TargetDirectory 参数指定的目录。 先入先出(FIFO)文件、块和字符设备文件等特殊文件类型将重新创建,而不是复制。 除非指定 -h 标志,否则将遵循符号链接。 -R 标志优于 -r 标志。
除了 -R 标志外,还可以指定以下标志:
-H
如果指定 -H 选项, cp 命令将根据任何符号链接所引用的文件类型和内容执行。 SourceFile 操作符。
-L
如果指定 -L 选项, cp 命令将根据任何符号链接所引用文件的类型和内容执行。 SourceFile 操作符或在遍历文件层次结构过程中遇到的任何符号链接所引用文件的类型和内容。
-P
如果指定 -P 选项, cp 命令将复制作为 SourceFile 操作符指定的任何符号链接,以及在遍历文件层次结构过程中遇到的任何符号链接,并且不跟随任何符号链接。
-S 如果源文件稀疏,则在将源文件复制到目标文件时保留其稀疏性。

sparse file 是一种计算机文件类型,当分配给文件的块为空时,它试图更有效地利用文件系统空间。

-U 将参数中的扩展属性 (EA) 和 ACL 复制到 SourceFile 参数中的 TargetFile 参数。 如果目标文件系统不支持 EA,则 EA 将被忽略。 如果目标文件系统不支持源 ACL 类型,则会将其转换为目标文件系统支持的兼容 ACL 类型。
-- 表示将破折号 (--) 标志后面的参数解释为文件名。 这个空标志允许指定以减号 (-) 开头的文件名。
下表显示不同情况下目标文件的加密或解密状态:
表 1. 目标文件加密或解密状态
cp 命令的显示标志 源文件 目标文件系统 结果
-e(加密) 非 EFS 非 EFS 错误
-e 非 EFS EFS 加密的文件
-e EFS EFS 加密的文件
-e EFS 非 EFS 错误
-d(解密) 非 EFS 非 EFS 明文文件
-d 非 EFS EFS 明文文件
-d EFS 非 EFS 明文文件
-d EFS EFS 明文文件
非显式标志 非 EFS 非 EFS 明文文件
非显式标志 非 EFS EFS 如果目标目录是已启用的 EFS 继承,则目标文件是加密文件。 否则,目标文件就是明文文件。
非显式标志 EFS EFS 加密的文件
非显式标志 EFS 非 EFS 错误
注意: 除非指定 -f 标志,否则不要用纯文本文件覆盖加密文件,也不要用加密文件覆盖纯文本文件。 目标的加密状态取决于 -e-d 标志、加密继承(如果没有将 -e-d 标志与 -f 标志一起指定)以及源文件的加密状态(如果加密继承不活动)。

退出状态

cp 命令返回以下退出值:

描述
重大安全事件数量 文件复制成功。
> 0 发生错误。

示例

  1. 要在当前目录下创建文件副本,请输入以下命令:
    cp prog.c prog.bak
    该命令将 prog.c 文件复制到 prog.bak 文件。 如果 prog.bak 文件不存在, cp 命令将创建该文件。 如果 prog.bak 文件存在, cp 命令会用 prog.c 文件的副本替换它。
  2. 要将当前目录下的文件复制到另一个目录,请输入以下命令:
    cp jones /home/nick/clients
    该命令将 jones 文件复制到 /home/nick/clients/jones 文件。
  3. 要将文件复制到新文件并保留与源文件相关的修改日期、时间和 ACL,请输入以下命令:
    cp -p smith smith.jr
    该命令将 smith 文件复制到 smith.jr 文件。 不是用当前日期和时间戳记创建文件,而是系统给 smith.jr 文件和 smith 文件相同的日期和时间。 smith.jr 文件继承了 smith 文件的访问控制保护。
  4. 要将一个目录中的所有文件复制到一个新目录,请输入以下命令:
    cp /home/janet/clients/* /home/nick/customers
    该命令只将 clients 目录中的文件复制到 customers 目录。
  5. 要将一个目录(包括其所有文件和子目录)复制到另一个目录,请输入以下命令:
    cp /home/janet/clients/* /home/nick/customers
    注: 无法将目录复制到其自身。
    该命令将 clients 目录,包括其所有文件、子目录和子目录中的文件复制到 customers/clients 目录。
  6. 要将一组特定文件复制到另一个目录,请输入以下命令:
    cp jones lewis smith /home/nick/clients
    该命令将工作目录中的 jones 文件、 lewis 文件和 smith 文件复制到 /home/nick/clients 目录。
  7. 要使用模式匹配字符复制文件,请输入以下命令:
    cp programs/*.c .
    该命令将 programs 目录中以 .c 文件结尾的文件复制到当前目录,以单点 (.) 表示。在 c 和最后一个点之间插入一个空格。
  8. 要将文件复制到新文件并保留与源文件相关的 ACL 和 EA,请输入以下命令:
    cp -U smith smith.jr
  9. 要在复制时保留源文件的稀疏性,请输入以下命令:
    cp -S file.c sparse_file.c

文件

/usr/bin/cp
包含 cp 命令。