名称

cp - 复制文件或目录

简介

cp [选项]... 源文件 目标文件
cp [选项]... 源文件... 目标目录
cp [选项]... -t 目标目录 源文件...

描述

cp 命令将 源文件 复制到 目标文件,或者将多个 源文件 复制到 目标目录 中。复制时可以选择是否保留文件属性(如权限、时间戳),并支持递归复制目录。

基本行为:

  • 如果指定两个文件名,cp 将第一个文件复制为第二个文件。

  • 如果最后一个参数是已存在的目录,cp 将每个源文件复制到该目录下(保持原名或指定新名)。

  • 复制目录时必须使用 -r-R--recursive 选项。

选项

短选项

长选项

描述

-a

--archive

归档模式,等同于 -dR --preserve=all,保留所有属性(链接、权限、时间戳等),常用于备份。

-b

--backup[=控制]

覆盖前备份目标文件,备份文件默认添加 ~ 后缀。控制参数可选:noneoffnumberedtexistingnilsimplenever

-d

--no-dereference

保留符号链接(不跟随),复制链接本身而非链接指向的文件。

-f

--force

强制覆盖,如果无法打开目标文件则先删除再尝试。

-i

--interactive

交互式模式,覆盖前提示确认(输入 y 确认)。

-l

--link

创建硬链接而非复制。

-L

--dereference

总是跟随符号链接(复制链接指向的文件)。

-n

--no-clobber

不覆盖已存在的目标文件(忽略,不提示)。

-P

--no-dereference

-d,不跟随符号链接。

-p

--preserve[=属性列表]

保留指定的属性。属性列表可以是 modeownershiptimestampslinksxattrcontextall 等。若未指定列表,则保留模式、所有权和时间戳。

-R

-r, --recursive

递归复制目录及其内容。

-s

--symbolic-link

创建符号链接(软链接)而非复制。源文件路径应为绝对路径或相对于链接位置的相对路径。

-t

--target-directory=目录

指定目标目录,将所有源文件复制到该目录下。

-T

--no-target-directory

将目标视为普通文件而非目录,即使最后一个参数是目录也强制进行文件复制(目标需为文件)。

-u

--update

仅在源文件比目标文件新或目标文件不存在时才复制。

-v

--verbose

显示每个复制的文件名。

-x

--one-file-system

停留在此文件系统中,递归时跳过挂载点下的目录。

--preserve[=属性]

-p,保留属性。

--no-preserve[=属性]

不保留指定的属性。

--parents

在目标目录中保留源文件的路径结构(例如 cp --parents dir/file.txt dest/ 将创建 dest/dir/file.txt)。

--remove-destination

复制前删除目标文件(而非覆盖)。

--strip-trailing-slashes

删除源参数末尾的 /,避免将目录误认为文件。

--backup[=控制]

-b

--suffix=后缀

自定义备份文件的后缀,取代默认的 ~

--help

显示帮助信息并退出。

--version

显示版本信息并退出。

退出状态

  • 0 – 成功。

  • >0 – 发生错误(例如源文件不存在、目标无法写入等)。

常用示例

1. 复制单个文件

cp file.txt file_backup.txt

2. 将文件复制到目录

cp file.txt /path/to/destination/

3. 复制多个文件到目录

cp file1.txt file2.txt file3.txt /target/dir/

4. 递归复制目录

cp -r /source/dir /target/dir

注意:如果目标目录已存在,会将源目录复制到目标目录下(形成 /target/dir/source/dir);如果目标目录不存在,则创建目标目录并将源内容放入其中。

5. 交互式覆盖提示

cp -i source.txt target.txt

如果 target.txt 存在,会询问是否覆盖。

6. 复制并保留文件属性(权限、时间戳)

cp -p file.txt file_backup.txt

7. 归档模式复制(保留所有属性,递归)

cp -a /source/dir /target/dir

8. 仅更新较新的文件

cp -u source.txt target.txt

只有当 source.txt 比 target.txt 新或 target.txt 不存在时才复制。

9. 创建硬链接而非复制

cp -l file.txt file_hardlink

10. 创建符号链接

cp -s /absolute/path/to/file.txt symlink

11. 复制前备份已有文件

cp -b file.txt file.txt          # 生成 file.txt~ 作为备份
cp --backup=numbered file.txt file.txt   # 生成 file.txt.~1~ 等编号备份

12. 复制并显示详细信息

cp -v file.txt /dest/

13. 保留路径结构(--parents)

cp --parents dir/subdir/file.txt /target/

这将创建 /target/dir/subdir/file.txt

14. 强制覆盖且不提示(默认行为,除非设置了别名)

cp -f source.txt target.txt

15. 不覆盖已存在文件

cp -n source.txt target.txt

如果 target.txt 存在,则不执行复制。

16. 复制符号链接本身(而非指向的文件)

cp -d symlink symlink_copy

这会将符号链接作为链接复制,而不是复制它指向的真实文件。

17. 组合选项:递归、保留属性、详细输出

cp -rpv /source/dir /target/dir

注意事项

  • 覆盖风险:默认情况下,cp 会静默覆盖目标文件(除非设置了别名如 alias cp='cp -i')。使用 -i-n 可避免意外覆盖。

  • 目录复制:复制目录必须使用 -r-a,否则会报错(“省略目录”)。

  • 符号链接

    • 默认行为是跟随符号链接,复制其指向的文件(类似 -L)。

    • 使用 -d-P 复制链接本身。

  • 权限保留:普通用户复制文件时,新文件权限通常受 umask 影响。使用 -p-a 可尝试保留源文件权限和时间戳,但可能因用户权限限制无法保留所有属性(如所有权可能需要 root)。

  • 跨设备复制:在不同文件系统间复制时,硬链接(-l)可能无法创建,会回退为普通复制。

  • 备份策略:使用 -b--backup 可以防止覆盖重要数据,但备份文件可能堆积,需定期清理。

  • 使用 -t 简化:当源文件列表较长时,-t 选项允许将目标目录写在前面,便于配合 find 等命令:

    bash

    find . -name "*.txt" -exec cp -t /dest/dir/ {} +
  • mv – 移动或重命名文件。

  • rm – 删除文件或目录。

    相关命令

  • ln – 创建链接(硬链接或符号链接)。

  • rsync – 高级文件复制和同步工具(支持增量、远程复制)。

  • scp / sftp – 通过 SSH 远程复制文件。

  • install – 复制文件并设置属性,常用于安装程序。

  • dd – 低级别复制和转换。