菜鸟科技网

终端cp命令如何高效复制文件?

cpcopy(复制)的缩写,用于将文件或目录从一个位置复制到另一个位置。

终端cp命令如何高效复制文件?-图1
(图片来源网络,侵删)

基本语法

cp 命令的基本语法如下:

cp [选项] 源文件 目标文件
cp [选项] 源文件... 目标目录
  • 源文件:你想复制的文件或目录的路径。
  • 目标文件:复制后文件的新路径或新名称。
  • 目标目录:如果将多个源文件复制到一个地方,那么最后一个参数必须是一个目录

最常用的用法示例

复制单个文件

这是最简单的用法,将一个文件复制到另一个位置。

# 将 file1.txt 复制到 /home/user/documents/ 目录下,文件名不变
cp file1.txt /home/user/documents/
# 将 file1.txt 复制到当前目录,并重命名为 file1_backup.txt
cp file1.txt file1_backup.txt

复制多个文件到指定目录

如果你想一次性复制多个文件到同一个文件夹,可以这样操作。

# 将 file1.txt, file2.txt, file3.txt 全部复制到 /home/user/documents/ 目录
cp file1.txt file2.txt file3.txt /home/user/documents/

复制整个目录(递归复制)

默认情况下,cp 命令无法直接复制目录,因为它不知道你是否想复制目录本身还是目录里的内容,要复制目录,必须使用 -r(递归)或 -R 选项。

终端cp命令如何高效复制文件?-图2
(图片来源网络,侵删)
# -r 或 -R 表示递归复制,会复制目录及其内部的所有文件和子目录
# 将 my_folder 目录复制到 /home/user/documents/ 下,成为 /home/user/documents/my_folder
cp -r my_folder /home/user/documents/

注意:在较新的 Linux 发行版中,推荐使用 -a 选项,因为它不仅递归,还保留了文件的所有属性(如权限、时间戳等)。


常用选项(Flags)

cp 命令的强大之处在于它的各种选项,可以满足复杂的复制需求。

选项 长选项 描述 示例
-i --interactive 交互式,如果目标文件已存在,会提示你是否覆盖。(强烈推荐,防止误操作) cp -i file1.txt file2.txt
-r --recursive 递归,用于复制目录及其所有内容。 cp -r dir1/ dir2/
-v --verbose 详细,显示正在复制的文件列表。 cp -v file1.txt file2.txt
-f --force 强制,如果目标文件已存在且没有写权限,会尝试删除它后再复制,不推荐轻易使用。 cp -f source.txt dest.txt
-a --archive 归档,这是一个非常强大的选项,相当于 -dR --preserve=all,它会递归地复制文件,并保留所有属性(权限、所有者、时间戳、符号链接等),在备份时非常有用。 cp -a my_project/ my_project_backup/
-u --update 更新,只有当源文件比目标文件新,或者目标文件不存在时,才进行复制,非常适合用于脚本中同步目录。 cp -u *.txt /backup/
-p --preserve 保留属性,除了权限,还可以保留所有者、组、时间戳等,可以指定要保留的属性,如 -p -p-p permissions cp -p config.ini /etc/
-l --link 硬链接,创建源文件的硬链接,而不是复制文件,这会节省磁盘空间。 cp -l large_file.txt linked_file.txt
-s --symbolic-link 符号链接,创建源文件的符号链接(软链接)。 cp -s /usr/bin/python /usr/local/bin/py

核心概念与注意事项

覆盖警告与 -i 选项

cp 命令最危险的地方就是它会静默地覆盖已存在的文件,而没有任何提示。

# 假设 dest.txt 已经存在
cp source.txt dest.txt

source.txtdest.txt 内容不同,dest.txt 的内容会被直接替换,且你不会收到任何警告。

终端cp命令如何高效复制文件?-图3
(图片来源网络,侵删)

解决方案:养成使用 -i 的习惯!

# dest.txt 已存在,系统会提示你
$ cp -i source.txt dest.txt
cp: overwrite 'dest.txt'? y
# 输入 'y' 确认,输入 'n' 或其他任意键取消

安全提示:你可以通过 alias 命令为 cp 设置一个默认别名,让 cp 命令默认就是 -i 模式。

alias cp='cp -i'

将这行添加到你的 ~/.bashrc~/.zshrc 配置文件中,就可以永久生效。

源和目标的区别

  • 如果目标是文件cp file1 file2 会将 file1 的内容复制到 file2file2 不存在,则创建它;如果存在,则覆盖它。
  • 如果目标是目录cp file1 /path/to/dir 会将 file1 复制到 /path/to/dir 目录内部,文件名仍然是 file1

复制 vs 移动

  • cp复制,源文件和目标文件会同时存在。
  • mv移动/重命名,操作后源文件会消失,目标文件出现。

综合实例

假设我们有以下文件结构:

.
├── documents/
│   ├── report.txt
│   └── notes/
│       └── idea.md
└── photos/
    └── vacation.jpg

场景1:备份整个 documents 目录,并保留所有属性。

cp -a documents/ documents_backup/

这会创建一个 documents_backup 目录,其内部结构和属性与 documents 完全一致。

场景2:将 report.txtidea.md 复制到桌面,如果文件已存在则提示。

cp -i documents/report.txt documents/notes/idea.md ~/Desktop/

场景3:只将比 backup/ 目录中更新的文件复制过去。

# 首先确保备份目录存在
mkdir -p backup
# 执行更新复制
cp -u documents/* backup/

场景4:创建一个文件的符号链接。

# 在 /usr/local/bin/ 目录下创建一个指向 /usr/bin/python3 的快捷方式 'py'
sudo cp -s /usr/bin/python3 /usr/local/bin/py

需求 推荐命令
复制单个文件 cp source.txt dest.txt
复制文件到目录 cp source.txt /path/to/dir/
复制目录 cp -r source_dir/ dest_dir/
安全复制(防覆盖) cp -i source.txt dest.txt
显示复制过程 cp -v source.txt dest.txt
完美备份目录(保留所有属性) cp -a source_dir/ dest_dir/
只复制更新的文件 cp -u source_dir/ dest_dir/

掌握 cp 命令是使用 Linux/Unix 终端的基础,特别是 -i-r-v-a 这几个选项,在日常工作中会频繁使用,请务必养成使用 -i 的好习惯,避免数据丢失。

分享:
扫描分享到社交APP
上一篇
下一篇