「cp(1)」-

复制文件或者目录

命令行语法格式

cp [OPTION]… [-T] SOURCE DEST

cp [OPTION]… SOURCE… DIRECTORY

cp [OPTION]… -t DIRECTORY SOURCE…

将SOURCE复制到DEST,或者多个SOURCE到DIRECTORY。拷贝的副本完全独立于原始文件。既可以将一个文件复制为另一个,也可以将任意数量的文件复制到指定的目录中。

命令描述

如果给出了两个文件,则将第一个复制到第二个。

如果给出–target-directory(-t)选项,或者如果最后一个参数是一个目录并且没有给出–no-target-directory(-T)选项,则cp会将每个源文件复制到指定的目录,文件名为原来的文件名。

通常,文件如何读入就如何写出。对于例外情况,参考下面的–sparse选项。

默认情况下,cp不会复制目录。但是,-R,-a和-r选项会导致cp通过递归到源目录,然后将文件复制到相应的目标目录来实现递归复制。

当从符号链接复制时,通常只在未递归复制或使用–link(-l)时,cp才遵循链接所指向的对象。可以使用–archive(-a),-d,–dereference(-L),–no-dereference(-P),-H选项覆盖此默认值。如果指定了这些选项中的一个以上,则最后一个选项将默认覆盖其他选项。

复制到符号链接时,cp仅在符号链接指向已经存在的文件时才会跟随链接指向的文件。但是,当复制到“悬空的”符号链接时,默认情况下cp会拒绝,并且会因诊断而失败,因为该操作本质上是危险的。这种行为与历史惯例和POSIX相反。设置POSIXLY_CORRECT来使cp尝试创建悬挂目标符号链接的目标,尽管存在可能的风险。另外,当类似–backup或–link的选项在复制之前将会重命名或删除目标时,cp将重命名或删除符号链接,而不是它指向的文件。

默认情况下,只有在不进行递归复制时,cp才复制特殊文件的内容。这个默认值可以用–copy-contents选项覆盖。

cp通常拒绝将文件复制到自身上,但有以下例外:如果–force –backup指定的SOURCE和DEST相同,并且是常规文件,则cp会将备份文件(常规或编号)作为 以常规方式指定(请参阅备份选项)。如果只是想在对现有文件进行更改之前对其进行备份,这个选项非常有用。

命令支持的选项及含义

长选项的必须参数,对于短选项也是必须的。

–copy-contents
使用该选项时,如果是递归复制,对于特殊文件(例如,FIFO和设备文件),直接复制内容,而不复制设备文件。使用此选项通常是一个错误,因为它通常对特殊文件(如FIFO)和通常在/dev目录中发现的特殊文件具有不良影响。在大多数情况下,如果cp -R –copy-contents尝试从FIFO和特殊文件(如/dev/console)中读取,将无限期挂起。如果使用它来复制/dev/zero,它将填满磁盘。
除非递归复制,否则此选项无效。此选项不影响符号链接的复制。

-f, –force
当不使用此选项时,如果目标文件已经存在,但是无法打开,则复制将会失败。如果使用了–force选项,当目标文件无法打开时,则cp会将其删除并尝试重新打开它。当此选项与–link(-l)或–symbolic-link(-s)组合时,目标链接将被替换,并且除了–backup(-b)之外当DEST不存在没有短暂时刻。

此选项独立于–interactive或-i选项:即不取消对方的效果。

当–no-clobber或-n选项也被使用时,该选项将被忽略。

-i, –interactive
覆盖文件之前进行提示。覆盖同一条命令中,位于-i之前的-n选项。

-n, –no-clobber
不覆盖已经存在的文件。覆盖同一条命令中,位于-n之前的-i选项。此选项与-b或者–backup互斥,不能一起使用。

–parents
通过SOURCE依照原由的层次结构复制到DEST目录中。提供给cp的最后一个参数必须是一个已经存在的目录名。例如,命令:

# cp –parents a/b/c existing_dir

将文件a/b/c复制到existing_dir/a/b/c,任何缺少的中间目录会自动创建。

-R, -r, –recursive
用于以递归方式复制目录。对于指向目录的符号链接,默认情况下,不会复制符号链接所指向的内容,除非与–link(-l)选项一起使用;请参阅–archive(-a),-d,–deference(-L),–no-dereference(-P)和-H选项。

通过创建与SOURCE相同类型的目标文件来复制特殊文件;请参阅–copy-contents选项。使用-r来复制符号链接或特殊文件的可移植性并不好的。在某些非GNU系统上,由于历史原因,-r等价于-L和–copy-contents一起使用。此外,使用-R来复制符号链接的可移植性也不好,除非还指定-P,因为POSIX允许在实现中默认情况下使用符号链接指向的文件。

–reflink[=WHEN]
如果filesystem支持,则执行轻量级、写时复制(COW)进行复制。一旦成功,只要它们内容保持不变,那么源文件和目标文件共享相同的磁盘数据块。因此,如果磁盘I/O错误影响了其中一个文件的数据块,则另一个遇到相同的命运。WHEN值可以是以下之一:

always,默认行为(如果为指定WHEN时),如果不支持COW操作,则报告每个文件的故障并退出失败状态。

auto,如果不支持写时复制操作,则可以回到标准复制行为。

该选项会被–link,–symbolic-link,–attributes-only选项覆盖,从而允许它用于配置cp的默认数据复制行为。例如,使用以下alias命令cp将使用由文件系统支持的最小数量的空间alias cp='cp --reflink=auto --sparse=always

–remove-destination
尝试打开之前,删除每个已经存在的目标文件(与上述-f对比)。

–sparse=WHEN
稀疏文件中包含空洞(不占用任何物理磁盘块的零字节序列);’read’系统调用将它们视为零进行读取。这可以节省大量的磁盘空间并提高速度,因为许多二进制文件包含大量连续的零字节。默认情况下,cp通过粗略启发式检测输入的源文件中的空洞,并使相应的输出文件也是稀疏的。只有普通文件可能是稀疏的。WHEN值可以是以下之一:

auto,默认行为。如果输入文件是稀疏的,则尝试将输出文件作为稀疏的。但是,如果输出文件存在,且引用是非常规文件,则不要尝试使其变为稀疏的。

always,对于输入文件中的每个足够长的零字节序列,尝试在输出文件中创建一个相应的「空洞」,即使输入文件似乎不是稀疏的。当输入文件在不支持稀疏文件的文件系统(例如,SGI IRIX 5.3及更早版本中的“efs”文件系统)中时,但输出文件位于支持它们的文件系统类型,这是有用的。「空洞」可能仅在普通文件中创建,因此如果目标文件是其他类型,cp命令甚至不会使其稀疏。

never,切勿使输出文件是稀疏的。在创建与mkswap命令一起使用的文件时,这非常有用,因为这样的文件不能有任何「空洞」。

–strip-trailing-slashes
从每个SOURCE中删除任何尾部的斜杠。参考结尾的斜线中的说明。

-u, –update
如果DEST与SOURCE的时间戳相同,或者DEST更新,则不要进行复制。即只复制在DEST中不存在的文件和SOURCE时间戳比DEST中时间戳新的文件。
如果时间戳被保留,则比较的是源时间戳被截断为目标文件系统和用于更新时间戳的系统调用的分辨率;如果使用相同的源和目的地执行多个“cp -pu”命令,则可以避免重复的工作。如果–preserve=link也被指定(例如,以’cp -au’为例),这将优先处理。因此,根据文件从源处理的顺序,可能会替换目标中的较新文件,到镜像源中的硬链接。

-x, –one-file-system
跳过在复制开始时在不同文件系统上的子目录。但是,依旧会复制挂载点目录。

-Z, –context[=CTX]
没有指定CTX,根据与目标文件DEST的系统默认类型一样来调整SELinux安全上下文,与restorecon命令类似。可以指定特定上下文的–context选项,将仅为新创建的文件设置上下文。使用指定的上下文,如果SELinux和SMACK都被禁用,则会发出警告。此选项与–preserve=context选项相互排斥,并覆盖–preserve=all和-a选项。

目标目录

-t, –target-directory=DIRECTORY
指定目标目录DIRECTORY。参考「目标目录」中的说明。

-T, –no-target-directory
当最后一个操作数为「目录」或「目录的符号链接」时,不要特别对待,参考「目标目录」中的说明。

例如,在不指定-T选项的情况下,如果/tmp/dest目录已经存在,则执行cp source dest等价于cp source dest/source命令。而我们想要的是将source复制为dest,这时就可以使用-T选项。

与「链接」有关的选项

-s, –symbolic-link
创建符号链接,而不是非目录的副本。所有源文件名必须是绝对路径(以“/”开头),除非目标文件DEST位于当前目录中。在不支持符号链接的系统上将产生错误。

-P, –no-dereference
将「符号链接」复制为「符号链接」,而不是复制他们指向的文件。此选项仅影响SOURCE中的符号链接;在DEST中的符号链接,依旧保持原样,使用其指向的对象。

-l, –link
创建文件的硬链接,代替原有的文件复制。

-L, –dereference
对符号链接指向的文件进行复制,而不是复制符号链接。使用此选项,cp无法创建符号链接。例如,SOURCE的符号链接(指向普通文件)将被复制为DEST目录树中的常规文件。

-H
如果命令行参数指定了一个符号链接,则复制其指向的文件而不是符号链接本身。然而,会复制在递归遍历中遇到的任何符号链接本身。

由「多选项」复合的「选项」

-a, –archive
等价于-dR –preserve=all。保留所有属性(–preserve=all)、复制目录(-R)、复制链接(-d)

尽可能保留副本中原始文件的结构和属性(但不要试图保留内部目录结构;即’ls -U’可能以不同顺序列出复制目录中的条目)。尝试保留SELinux安全上下文和扩展属性(xattr),但忽略任何失败,并且不打印相应的诊断信息。

-d
等价于–no-dereference –preserve=links。复制符号链接,而不是符号链接指向的文件,并且也会保留副本和源文件之间的硬链接。

-p
等价于–preserve=mode,ownership,timestamps

帮助信息

–help
用于输出帮助信息。

–version
用于输出版本信息。

调试选项

-v, –verbose
用于打印复制信息,显示当前正在复制的文件。

复制属性

–attributes-only
不复制文件的数据,只复制文件的属性。仅将源文件SOURCE的指定属性复制到目标DEST。如果DEST已经存在,请不要更改其内容。请参阅–preserve选项,来控制要复制的属性。

–preserve[=ATTR_LIST]
保存指定的属性,参数ATTR_LIST的默认值为mode,ownership,timestamps,它支持如下属性字符串(多个属性字符串之间使用逗号分隔):

mode
保留文件模式位和访问控制列表。

ownership
保留所有者和组。在大多数现代系统中,只有具有适当权限的用户才可以更改文件的所有者,普通用户只有在碰巧是所需组的成员时才可以保留文件的组所有权。

timestamps
尽可能保留上次访问和上次修改的时间。在较旧的系统上,当受影响的文件是符号链接时,不可能保留这些属性。然而,许多系统现在提供了utimensat函数,这使得这个功能可以用于符号链接。

links
在目标文件中保存相应源文件之间的任何链接。请注意,使用-L或-H,此选项可将符号链接转换为硬链接。如下示例:

# mkdir c; : > a; ln -s a b; cp -aH a b c; ls -i1 c

74161745 a

74161745 b

context
保留文件的SELinux安全上下文,或失败时显示完整诊断信息。

xattr
保留文件的扩展属性,或者在失败的情况下显示诊断信息。如果cp构建时没有xattr支持,忽略此选项。如果使用xattrs实现SELinux上下文,ACL或Capabilities,则它们也会通过此选项进行隐式地保留,即使未指定–preserve=mode或–preserve=context也是如此。

all
保留所有的属性,等价于指定了上面所有的属性,但不同的地方是保留SELinux上下文或者扩展属性失败时不会修改cp的退出状态。与-a相比,输出除’Operation not supported’之外的所有警告。

在没有此选项的情况下,现有文件DEST的权限不变。每个新文件都使用对应的源文件SOURCE的模式创建,但是移除SETUID,SETGID和沾滞位;操作系统会应用umask或默认ACL,这可能会导致更严格的文件模式。参阅文件权限

–no-preserve=ATTR_LIST
指定不要保存的属性。ATTR_LIST参见–preserve[=ATTR_LIST]选项中属性值的介绍,二者的形式是相同的。

与「备份」有关的选项

一些GNU程序(至少cp,install,ln和mv)可以在写入新版本之前,会备份文件。这些选项控制了备份的详细信息。在特定程序的描述中也简要提到了这些选项。

–backup[=CONTROL]
备份每个可能被覆盖或删除的文件。作为一种特殊情况,在给出–backup和–force选项,并且SOURCE和DEST是指向同一个常规文件,此时cp会对源SOURCE进行备份,这种组合选项在下面的脚本中用到了:

#!/bin/sh

fail=0

for i; do

cp –backup –force –preserve=all — “$i” “$i” || fail=1

done

exit $fail

备份每个文件,否则原文件将被覆盖或删除。没有此选项,原始文件将被销毁。使用CONTROL来确定要进行备份的类型。当使用此选项但未指定CONTROL时,将使用VERSION_CONTROL环境变量的值。如果VERSION_CONTROL未设置,则默认备份类型为“existing”。

该选项对应于Emacs变量’version-control’;CONTROL的值与Emacs中使用的值相同。此选项也接受更多描述性的名称,有效的CONTROL是(接受唯一的缩写):

‘none’ / ‘off’: 不进行备份。复制时,覆盖原有文件。

‘numbered’ / ‘t’: 创建数字类型的备份。默认的后缀为:.~INDEX~

‘simple’ / ‘never’: 创建简单的备份。生成后缀为~的备份文件。

‘existing’ / ‘nil’: 使用原有的备份方案。即如果文件使用了「数值类型」的备份,则继续使用;否则,执行simple备份。

-b
简写,等价于–backup=existing
对已经拥有它们的文件进行编号备份,简单备份其他文件。

-S, –suffix=SUFFIX
覆盖默认的后缀。将SUFFIX添加到使用-b创建的每个备份文件,通常是simple备份方法。如果未指定此选项,则使用SIMPLE_BACKUP_SUFFIX环境变量的值。如果SIMPLE_BACKUP_SUFFIX未设置,默认值为’~’,与Emacs一样。

注意事项

复制「文件」时,cp file1 file2
如果file1为软链接,那file2复制软链接指向的原文件。如果要改变行为,即复制软链接,使用-d选项。

复制「目录」时,cp -r dir1 dir2
如果dir1为软链接,则复制的内容为软链接。即保持原本类型。

使用示例

原模原样复制文件及目录,包含属性、链接:

# cp -r –no-dereference –preserve=all src dest

# cp -a src dest

上面的两个命令是等价的。

相关手册

查看在线手册:http://www.gnu.org/software/coreutils/cp

查看info手册:info ‘(coreutils) cp invocation’

参考文献