简介
cp 命令来源于英文单词 “copy”,用于复制文件和目录。它是 Linux 系统中最常用的文件管理命令之一,可以将文件或目录从一个位置复制到另一个位置。
使用方式
cp[选项]... 源文件 目标文件
cp[选项]... 源文件... 目标目录
常用选项
-a, --archive
:实现归档功能,效果等同于-dR
。--attributes-only
:只复制文件的属性,而不复制文件的数据内容。--backup[=CONTROL]
:在复制文件时,为每个已存在的目标文件创建一个备份。防止错误地覆盖了同名目标文件而造成数据丢失。其中CONTROL
作为一个可选的参数,可以指定备份的方式。详见下文。-b
:和--backup
类似但不接受参数。--copy-contents
:在递归地复制特殊文件时,确保复制这些文件的内容而不仅仅是其属性和链接信息。-d
:效果同--no-dereference --preserve=links
。确保在复制过程中不改变链接的特性。-f, --force
:如果目标位置已存在一个同名文件,且该文件无法被打开,则先删除这个文件并再次尝试复制,可认为是强制覆盖目标文件(如果同时使用了-n
选项,则-f
会被忽略)。-i, --interactive
:打开交互式提示,如果目标位置已存在同名文件,则会提示用户是否要进行覆盖。-H
:如果命令行给出的源路径中存在符号链接,则复制符号链接所指向的文件。-l, --link
:创建源文件的硬链接,而非复制文件内容。-L, --dereference
:如果源文件是符号链接,则复制符号链接所指向的文件。与-H
不同的是,-H
仅作用于命令行中指定的符号链接,而-L
将会解析所有其遇到的符号链接。-n, --no-clobber
:不覆盖一个已存在的文件。-P, --no-dereference
:复制符号链接本身,而不是其指向的实际文件。-p
:效果同--preserve=mode,ownership,timestamps
。--preserve[=ATTR_LIST]
:复制时保留指定的属性(默认为:mode,ownership,timestamps
),可选的其他属性有:context, links, xattr, all
。--no-preserve=ATTR_LIST
:复制时不要保留指定的属性。--parents
:复制时保留源文件的完整路径结构。-R, -r, --recursive
:复制整个目录,包括其内部的所有子目录和文件。--reflink[=WHEN]
:控制复制的 clone/CoW 行为。具体见下文。--remove-destination
:如果目标文件已存在,则会删除目标文件,再进行复制。区别于-f
,该选项会确保先删除后复制,得到的是全新的文件,而-f
可能只是将源文件的内容覆盖到目标文件,目标文件本身并没有被删除。--sparse=WHEN
:控制稀疏文件的创建,详见下文。--strip-trailing-slashes
:去除每个源文件名末尾的斜杠(/)。-s, --symbolic-link
:创建源文件的符号链接,而不是复制文件内容。-S, --suffix=SUFFIX
:创建备份文件时指定一个自定义的后缀。-t, --target-directory=DIRECTORY
:该选项允许同时指定多个源文件一次性复制到指定的目录。-T, --no-target-directory
:将指定目标视为普通文件,而不考虑其是否为目录。-u, --update
:只在源文件较新或目标文件缺失时才执行复制操作。-v, --verbose
:在命令执行过程中输出详细的操作信息。-x, --one-file-system
:使cp
在执行时仅限于当前文件系统内,避免跨越到其他文件系统。-Z
:设置目标文件的 SELinux 安全上下文为默认类型。--context[=CTX]
:将目标文件的 SELinux 或 SMACK 安全上下文设置为指定的CTX
,若未指定,那效果与-Z
相同。--help
:显示帮助信息。--version
:显示版本信息。
- - backup[=CONTROL]
默认的备份文件后缀为 ‘
~
’,也可通过
--suffix
或
SIMPLE_BACKUP_SUFFIX
这个环境变量来修改。
--backup
可以用来控制备份的模式,也可以通过
VERSION_CONTROL
这个环境变量来设定。具体的模式如下:
none, off
:从不创建备份文件(即使用了--backup
)选项。numbered, t
:以编号形式创建备份。existing, nil
:如果已存在编号备份,则创建编号备份;如果没有,则创建简单备份(如添加~
后缀)。simple, never
:始终创建简单备份,即总是使用~
作为后缀。
- - reflink[=WHEN]
当指定了
--reflink[=always]
时,
cp
命令会执行一种轻量级的复制方式。在这种情况下,只有在原始数据块被修改时,才会实际复制这些数据块。如果系统不支持该操作,那复制会失败。
当使用
--reflink=auto
时,系统会尝试进行这种轻量级的复制,如果此时失败,则会回退到普通的复制模式。
使用
--reflink=never
则会确保本次复制是普通模式。
稀疏文件
默认情况下,系统会用一种简单的启发式(crude heuristic)方式来检测源文件是否为稀疏文件。如果源文件被识别为稀疏文件,那么目标文件也会被设置为稀疏文件。这种行为由
--sparse=auto
来控制。
如果指定了
--sparse=always
,系统会在源文件包含有足够长的零字节序列时创建稀疏文件。
使用
--sparse=never
将确保目标文件始终是一个常规文件。
参考示例
1. 复制文件到另一个目录
cp test.txt subdir/
上述指令将当前目录下的
test.txt
文件复制到了当前目录的
subdir
目录下:
jay@jaylinuxlenovo:~/test/cmd_test_dir$ cp test.txt subdir/
jay@jaylinuxlenovo:~/test/cmd_test_dir$ ls-R
.:
subdir test.txt
./subdir:
test.txt
首先执行复制指令,再使用
ls
命令查看当前目录结构发现
test.txt
已被成功复制到了
subdir
目录下。
2. 复制文件并备份已存在的目标文件
cp--backup test.txt subdir/
在示例 1 的基础上,加入
--backup
选项,由于示例 1 中已经复制了一个
test.txt
到
subdir
中,因此本次复制由于使用了
--backup
,系统会自动对原先的
test.txt
创建一个备份:
jay@jaylinuxlenovo:~/test/cmd_test_dir$ cp--backup test.txt subdir/
jay@jaylinuxlenovo:~/test/cmd_test_dir$ ls-lR
.:
total 8
drwxrwxr-x 2 jay jay 4096 Jul 2214:50 subdir
-rw-rw-r-- 1 jay jay 17 Jul 2214:37 test.txt
./subdir:
total 8
-rw-rw-r-- 1 jay jay 17 Jul 2214:50 test.txt
-rw-rw-r-- 1 jay jay 17 Jul 2214:38 test.txt~
经过复制后可以发现
subdir
中多了一个
test.txt~
的文件,该文件即系统在复制之前创建的原
test.txt
的备份文件。
3. 复制整个目录
cp-r subdir ./test
复制当前目录下的
subdir
目录及其内部的所有内容到当前目录下的
test
目录中:
jay@jaylinuxlenovo:~/test/cmd_test_dir$ cp-r subdir ./test
jay@jaylinuxlenovo:~/test/cmd_test_dir$ ls-lRtest
test:
total 4
drwxrwxr-x 2 jay jay 4096 Jul 2214:56 subdir
test/subdir:
total 8
-rw-rw-r-- 1 jay jay 17 Jul 2214:56 test.txt
-rw-rw-r-- 1 jay jay 17 Jul 2214:56 test.txt~
可见 subdir 及其内容已经全部复制到了
test
目录中。
4. 交互式复制文件
cp-i test.txt ./subdir/
使用
-i
选项可以在目标文件已存在时提示用户是否要覆盖,此时输入
y/n
可以决定是否覆盖:
jay@jaylinuxlenovo:~/test/cmd_test_dir$ cat ./subdir/test.txt
This is test.txt
jay@jaylinuxlenovo:~/test/cmd_test_dir$ cp-i test.txt ./subdir/
cp: overwrite './subdir/test.txt'? y
jay@jaylinuxlenovo:~/test/cmd_test_dir$ cat ./subdir/test.txt
This is a new test.txt
可以看到在复制之前使用
cat
命令查看
test.txt
内容为
This is test.txt
,此时使用
cp -i
指令进行复制,并且在系统进行交互提示后输入
y
确认。最后再次使用 cat 命令查看文件内容已经变成了
This is a new test.txt
,表示覆盖成功。
5. 创建文件的硬链接
cp-l test.txt test_hl.txt
使用
-l
选项创建
test.txt
的硬链接,并且将其命名为
test_hl.txt
:
jay@jaylinuxlenovo:~/test/cmd_test_dir$ cp-l test.txt test_hl.txt
jay@jaylinuxlenovo:~/test/cmd_test_dir$ ls-l
total 16
drwxrwxr-x 2 jay jay 4096 Jul 2214:50 subdir
drwxrwxr-x 3 jay jay 4096 Jul 2214:58 test
-rw-rw-r-- 2 jay jay 24 Jul 2215:02 test_hl.txt
-rw-rw-r-- 2 jay jay 24 Jul 2215:02 test.txt
6. 创建文件的符号链接
cp-s test.txt test_sl.txt
使用
-s
选项创建
test.txt
的软链接,并将其命名为
test_sl.txt
:
jay@jaylinuxlenovo:~/test/cmd_test_dir$ cp-s test.txt test_sl.txt
jay@jaylinuxlenovo:~/test/cmd_test_dir$ ls-l
total 16
drwxrwxr-x 2 jay jay 4096 Jul 2214:50 subdir
drwxrwxr-x 3 jay jay 4096 Jul 2214:58 test
-rw-rw-r-- 2 jay jay 24 Jul 2215:02 test_hl.txt
lrwxrwxrwx 1 jay jay 8 Jul 2215:13 test_sl.txt -> test.txt
-rw-rw-r-- 2 jay jay 24 Jul 2215:02 test.txt
注意事项
- 在复制大量文件或大型目录时,注意磁盘空间和权限设置。 使用 -r 选项时要小心,特别是当目的地是系统目录或其他重要目录时。
- 在使用 -f 强制覆盖时要小心,以免不小心覆盖重要文件。
- 创建符号链接(-s)时,源文件的路径应该是绝对路径,以避免链接断裂。
- 使用 -i 选项可以在覆盖文件前进行确认,减少误操作风险。
版权归原作者 WKJay_ 所有, 如有侵权,请联系我们删除。