cp

复制文件或目录


语法格式

cp [-bcdfHilLnpPsSuv] [-S suffix] [-Z ctxt] [gnu-opts] srcfile destfile
cp [-abcdfHilLnpPsSuv] [-S suffix] [-t dir] [-Z ctxt] [gnu-opts]
        srcfiles destdir
cp [-abcdfHilLnpPrRsSuv] [-S suffix] [-t dir] [-Z ctxt] [gnu-opts]
        srcdirs destdir
cp [-abcdfHilLnpPsSuv] [-S suffix] [-t dir] [-Z ctxt] [gnu-opts]
        -t destdir srcfiles
cp [--help] [--version]

命令简介

cp命令主要用于复制文件(或目录)。例如,把一个源文件复制到目的文件,或把多个源文件复制到目的目录中。其中,srcfile是源文件的路径名,srcfiles是一个或一组源文件的路径名,destfile是目的文件的路径名(主要用于单个文件复制),srcdirs是一个或一组源目录的路径名,destdir是目的目录的路径名,其中包含复制后的文件。

在第一种语法格式中,源文件和目的文件均为普通文件,而且不能同名。cp命令把源文件的内容复制到命名的目的文件中。如果目的文件存在,将会覆盖其原有的内容,但文件的用户ID、用户组ID、访问权限等属性保持不变,目的文件的修改时间和源文件的访问时间将设置为当前时间。如果目的文件不存在,则按指定的文件路径名创建一个新的文件,且与源文件具有相同的访问权限。如果目的文件是一个符号链接文件,cp将会覆盖其链接的目标文件的内容,但链接关系保持不变。

在第二种和第四种语法格式中,可以把一个或多个源文件复制到指定的目的目录中。

在第三种语法格式中,可以把一个或多个源目录复制到指定的目的目录中。注意,必须同时指定“-r”或“-R”选项。对于每一个源目录,cp将会复制其中的所有文件,包括子目录中的文件。如果指定的目的目录存在,cp命令将会把每个源目录复制到指定的目录中,否则将把源目录整体复制到指定的新目录。

命令选项

-a, --archive  尽可能多地保持源文件的目录结构与属性,也尝试保持SELinux安全属性与扩充属性,但会忽略与之有关的处理错误。相当于同时指定了“-dR”与“--preserve=all”选项。

-b  类似于“--backup”选项,但不能指定控制参数。

-c  如果可能,保持源文件的SELinux安全属性。这相当于指定了“--preserve= context”选项。注意,某些文件系统并不支持SELinux安全属性。

-d  仅仅复制符号链接文件本身,而不复制其引用的文件。对于硬链接文件而言,保持源文件间的链接计数。这相当于同时指定了“--no-dereference”与“--preserve=links”选项。

-f, --force  如果无法以“写”的方式打开现有的目的文件,复制通常会失败。如果指定了这个选项,cp命令首先会删除目的文件,然后再尝试继续复制文件。注意,如果指定了“-n”选项,则“-f”选项无效。

-H  如果源文件为符号链接文件,使用其引用的文件作为源文件,复制其文件数据。

-i, --interactive  交互复制方式。当指定的目的文件存在时,为防止覆盖原有的文件,cp命令将会提示用户存在同名的文件。仅当用户输入“y”确认之后,cp命令才会继续执行复制;其他的任何回答将会终止文件复制的执行,从而防止覆盖原有的文件(使用“-n”选项可抵消“-i”选项)。

-l, --link  以创建硬链接文件的方式取代文件复制。

-L, --dereference  如果源文件为符号链接文件,使用其引用的文件作为源文件,复制其文件数据。在递归复制模式中,子目录中的符号链接文件也是如此处理。

-n, --no-clobber  禁止覆盖现有的文件(可以抵消“-i”选项的作用)。

-p  确保复制后的文件属性与源文件相同,其效果相当于指定了“--preserve=mode,ownership,timestamps”选项。cp不仅复制源文件的数据,也会保持文件复制后的用户ID、用户组ID、访问权限、修改时间及访问时间等属性不变。为了维持复制后的文件属性,命令发布者必须是超级用户或具有适当的文件访问权限。

-P, --no-dereference  如果源文件为符号链接文件,则复制符号链接文件本身,而非其引用的文件。在递归复制模式中,子目录中的符号链接文件也是如此处理。

-R, -r, --recursive  目录文件递归复制模式。当指定的源文件为目录时,cp命令将会递归地复制目录及其中的任何文件,把指定的目录及其中的所有文件(包括子目录中的文件)复制到指定的目录位置。除非明确指定了“-H”、“-L”或“-P”,否则以“-L”选项作为默认的处理动作。

-s, --symbolic-link  以创建符号链接文件的方式取代文件复制。

-S suffix, --suffix=suffix  备份文件通常是在文件名后面附加一个波浪号“~”后缀,利用这个选项可以指定不同的后缀字符。

-t dir, --target-directory=dir  把所有的源文件复制到指定的目录中。

-u, --update  仅当源文件比目的文件更新或目的文件不存在时,才执行文件复制。

-v, --verbose  显示文件复制的处理过程与动作。

-Z ctxt, --context=ctxt  按照指定的SELinux属性设置复制后的文件。

--backup[=control]  在复制之前,备份现有的任何同名文件,以免覆盖。有效的控制参数包括none或off(不备份)、numbered或t(在备份文件名后面增加数字顺序号)、existing或nil(若存在数字编号的备份文件,使用数字方式,否则采用简单的文件备份方式)及simple或never(采用简短的文件备份方式)。

--copy-contents  在递归复制时,就像复制普通文件一样,可以把特殊文件(如管道文件和设备文件)中的数据内容复制到目的文件中。注意,在多数情况下,“cp -R --copy-contents”命令可能会陷于无尽的等待之中,如果复制的是/dev/zero文件,也可能会耗尽目的磁盘。

--preserve[=attr_list]  复制后的文件应保持指定的属性。默认的属性包括mode(访问权限)、ownership(用户与用户组)和timestamps(时戳)。其他可以指定的属性包括context(SELinux属性)、links(链接)、xattr(扩充属性)及all(所有属性)。

--no-preserve=attr_list  复制后的文件不要保持指定的属性。

--parents  把源文件复制到指定的目录,但要保持源文件的完整路径名。

--remove-destination  在尝试打开之前,删除现有的每一个同名的目的文件(参见“-f”选项)。

--strip-trailing-slashes  删除每个源文件参数中的斜线字符“/”后缀。

应用实例

1. 复制单个文件。

$ cp atmcom.c atmcom.old
$ ls atm*
atmcom.c atmcom.old
$

2. 把指定目录中的所有文件复制到指定的目录中。

$ cp ~/src/* /mnt/src
$

3. 原封不动地复制一个完整的目录,包括其中的所有文件、子目录及其文件。

$ ls save
save not found
$ cp -r src save
$ ls -R save
atmmon.c atmcom.c handler.c listener.c
$ cp -r src save
$ ls -R save
atmmon.c atmcom.c handler.c listener.c
src:
atmmon.c atmcom.c handler.c listener.c
$

4. 有意识地增加“-i”选项,防止误删文件。

$ ls atm*
atmcom.c atmcom.old
$ cp –i atmcom atmcom.old
cp: overwrite atmcom.old (yes/no)? y
$

索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z