Skip to main content

Linux 核心命令

文件和目录管理命令 cp

cp 是 Linux 中用来复制文件和目录的命令,全称是 copy。它超级常用,无论是备份文件、复制到新目录,还是处理复杂点的文件操作,都少不了它。

1. 复制单个文件

最简单的用法是把一个文件复制到另一个地方。基本语法是:

cp 源文件 目标文件
  • 源文件:你要复制的文件。
  • 目标文件:复制后的文件名或路径。

例子

cp document.txt document_copy.txt

这会把 document.txt 复制一份,命名为 document_copy.txt,两者内容一样,但文件名不同。如果 document_copy.txt 已经存在,新文件会直接覆盖它。

2. 复制文件到指定目录

想把文件复制到一个目录,而不是改名?直接把目录路径写在目标位置:

cp document.txt /home/user/backup/
  • 如果目标目录存在,document.txt 会被复制到 /home/user/backup/,文件名不变。
  • 如果目标目录不存在,命令会报错。

注意:目录路径最后加不加 / 都行,效果一样。

3. 复制多个文件到目录

可以一次复制多个文件到同一个目录,语法是:

cp 文件1 文件2 文件3 目标目录

例子

cp file1.txt file2.txt file3.txt /home/user/backup/

这会把 file1.txtfile2.txtfile3.txt 都复制到 /home/user/backup/ 目录下。

4. 复制目录

复制目录需要加 -r(或 --recursive),因为目录可能包含文件和子目录,得递归复制。语法是:

cp -r 源目录 目标目录

例子

cp -r my_folder my_folder_copy
  • 这会把 my_folder 整个目录(包括里面的文件和子目录)复制为 my_folder_copy
  • 如果目标目录已存在,my_folder 会被复制到目标目录下,成为子目录。

例子(复制到现有目录):

cp -r my_folder /home/user/backup/

my_folder 会出现在 /home/user/backup/my_folder/ 下。

5. 覆盖提示:加上交互模式

默认情况下,cp 复制时会直接覆盖同名文件。如果不想误操作,可以用 -i(或 --interactive)让命令在覆盖前询问你:

cp -i document.txt document_copy.txt

如果 document_copy.txt 已存在,命令会提示:

cp: overwrite 'document_copy.txt'? 

输入 y 确认覆盖,输入 n 取消。

6. 强制覆盖:不提示直接覆盖

如果你确定要覆盖,不想被打断,用 -f(或 --force):

cp -f document.txt document_copy.txt

这会直接覆盖 document_copy.txt,不给提示。适合脚本里不想手动确认的场景。

7. 保留文件属性

复制文件时,默认会丢失一些元信息,比如权限、时间戳、所有者等。用 -p(或 --preserve)可以保留这些属性:

cp -p document.txt document_copy.txt

这会让 document_copy.txt 保留 document.txt 的权限、时间戳等信息。可以检查一下:

ls -l document.txt document_copy.txt

如果不加 -p,新文件的权限和时间戳可能会变。

想保留更多属性(比如符号链接、扩展属性),可以用 --preserve=all

cp --preserve=all document.txt document_copy.txt

8. 复制符号链接

默认情况下,cp 复制符号链接时会复制链接指向的实际文件内容。如果只想复制链接本身,用 --no-dereference

cp --no-dereference symlink_file new_symlink

例子
假设 symlink_file 是个指向 document.txt 的符号链接:

ln -s document.txt symlink_file
cp --no-dereference symlink_file new_symlink

new_symlink 会是一个新的符号链接,也指向 document.txt,而不是复制 document.txt 的内容。

9. 复制时备份原文件

担心覆盖文件后后悔?可以用 --backup 自动为目标文件创建备份:

cp --backup document.txt document_copy.txt

如果 document_copy.txt 已存在,它会被重命名为 document_copy.txt~,然后新的 document_copy.txt 会被创建。

可以用 --suffix 自定义备份文件的后缀:

cp --backup --suffix=.bak document.txt document_copy.txt

这会把备份文件命名为 document_copy.txt.bak

10. 复制整个目录结构

想复制目录时保留所有内容(包括子目录、符号链接、权限等),可以组合选项:

cp -a 源目录 目标目录

-a(或 --archive)是超级强大的选项,它会:

  • 递归复制(包含 -r 的功能)。
  • 保留文件属性(包含 -p 的功能)。
  • 保留符号链接。
  • 尽量保留所有元信息。

例子

cp -a my_folder my_folder_copy

这会把 my_folder 完整复制为 my_folder_copy,几乎一模一样。

11. 只更新较新的文件

如果只想复制比目标文件新的文件(比如同步更新),用 -u(或 --update):

cp -u document.txt /home/user/backup/
  • 如果 /home/user/backup/document.txt 不存在,文件会被复制。
  • 如果目标文件存在,只有当源文件比目标文件新(或目标文件缺失)时才会复制。

这在备份或同步场景特别有用。

12. 复制时显示进度

复制大文件或目录时,想知道进度咋样?用 -v(或 --verbose)显示详细信息:

cp -v document.txt document_copy.txt

输出会告诉你复制了啥:

'document.txt' -> 'document_copy.txt'

复制目录时,-v 会列出所有被复制的文件。

13. 复制时忽略错误

复制大量文件时,可能会遇到权限问题或文件缺失。用 --no-clobber(或 -n)避免覆盖现有文件:

cp -n document.txt document_copy.txt

如果 document_copy.txt 已存在,命令会跳过,不会覆盖。

14. 结合通配符批量复制

可以用通配符(*?)批量复制文件:

cp *.txt /home/user/backup/

这会把当前目录下所有 .txt 文件复制到 /home/user/backup/

例子(更复杂的通配符):

cp file[0-9].txt /home/user/backup/

这会复制 file0.txtfile9.txt 的文件。

15. 处理特殊文件名

如果文件名有空格或特殊字符(比如 my file.txt),用引号或转义:

cp "my file.txt" "my file copy.txt"

或:

cp my\ file.txt my\ file\ copy.txt

16. 复制到远程服务器

cp 本身不直接支持远程复制,但可以结合 scprsync。不过,如果你用 cp 复制到挂载的网络文件系统,也没问题:

cp document.txt /mnt/remote_server/backup/

(假设 /mnt/remote_server/ 是挂载的远程目录。)

17. 常见组合用法

实际操作中,经常会组合多个选项。比如:

cp -rvp my_folder /home/user/backup/
  • -r:递归复制目录。
  • -v:显示复制过程。
  • -p:保留文件属性。

例子(超级完整复制):

cp -auv --backup --suffix=.bak my_folder /home/user/backup/
  • -a:保留所有属性和结构。
  • -u:只复制更新的文件。
  • -v:显示进度。
  • --backup:备份目标文件。
  • --suffix=.bak:备份文件加 .bak 后缀。