文件和目录管理命令 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.txt
、file2.txt
和 file3.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.txt
到 file9.txt
的文件。
15. 处理特殊文件名
如果文件名有空格或特殊字符(比如 my file.txt
),用引号或转义:
cp "my file.txt" "my file copy.txt"
或:
cp my\ file.txt my\ file\ copy.txt
16. 复制到远程服务器
cp
本身不直接支持远程复制,但可以结合 scp
或 rsync
。不过,如果你用 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
后缀。