Linux的shell的cp
命令,常用cp -a
在Linux中,cp
(copy)命令是一个非常基本的命令,用于复制文件或目录。它提供了多种选项来满足不同的复制需求。下面是一些cp
命令的基本用法和选项。
基本用法
复制文件到另一个位置:
cp source_file destination_file
这会将
source_file
复制到destination_file
。如果destination_file
已经存在,它会被覆盖,除非使用了特定的选项来防止这种情况。复制目录(需要
-r
或-R
选项来递归复制):cp -r source_directory destination_directory
这会递归地复制
source_directory
到destination_directory
。如果destination_directory
不存在,它会被创建。
常用选项
-i
(或--interactive
):在覆盖文件之前提示用户。cp -i source_file destination_file
-r
,-R
(或--recursive
):递归复制目录。cp -r source_directory/ destination_directory/
-v
(或--verbose
):显示详细的处理信息。cp -v source_file destination_file
-p
(或--preserve
):保留原文件的属性,如修改时间、访问时间、文件模式、文件所有权和组所有权。cp -p source_file destination_file
-a
(或--archive
):等同于-dR --preserve=all
,常用于备份,因为它会尽可能保留原文件的所有属性。cp -a source_directory/ destination_directory/
-u
(或--update
):仅当源文件比目标文件新或目标文件不存在时,才复制文件。cp -u source_file destination_file
-l
(或--link
):对源文件创建硬链接,而非复制文件。注意,这不适用于目录,仅对文件有效。cp -l source_file link_to_source_file
注意事项
- 使用
cp
命令时,特别是当使用递归复制选项(-r
或-R
)时,请确保目标路径不会导致无限循环(例如,不要尝试将目录复制到其子目录中)。 - 如果目标文件或目录已存在,并且没有使用
-i
选项,则它会被覆盖,而不会发出任何警告。 - 对于重要的文件或目录,建议先进行备份,然后再执行复制操作,以防万一复制过程中出现错误导致数据丢失。
cp
命令是Linux和Unix系统中不可或缺的工具之一,掌握其基本用法和常用选项对于日常的系统管理和文件操作至关重要。
常用 cp -a
在Linux的shell中,cp
命令用于复制文件或目录,而-a
(或--archive
)选项是cp
命令的一个非常有用的选项,它结合了多个其他选项的功能,以尽可能完整地复制文件或目录。
-a
选项通常被称为“归档”选项,因为它旨在保留尽可能多的原文件或目录的属性。具体来说,-a
选项等同于以下选项的组合:
-dR
:递归复制目录,并保持链接不变(-d
表示复制链接本身,而不是链接指向的文件;-R
或-r
表示递归复制)。--preserve=all
:保留所有文件属性,包括所有权、时间戳、访问权限、ACLs(访问控制列表,如果支持的话)、扩展属性、链接、文件数据和目录的所有内容。
因此,当你使用cp -a
命令时,你实际上是在说:“我想要复制这个文件或目录,并且我想保留所有与之相关的属性,就像它是被归档或备份的那样。”
这里有一些使用cp -a
命令的例子:
复制目录及其所有内容(包括子目录和文件),保留所有属性:
cp -a source_directory/ destination_directory/
注意:如果
destination_directory/
不存在,cp
会创建它。如果它已存在,并且你想在destination_directory/
内部创建一个名为source_directory
的目录(即保持目录结构),上面的命令就是这样做的。但如果你只想在destination_directory/
下复制source_directory
的内容(不包括source_directory
目录本身),你应该这样做:cp -a source_directory/* destination_directory/
注意:使用
*
时,如果source_directory
包含以.
开头的隐藏文件或目录,你可能需要使用shopt -s dotglob
命令来使shell包含这些文件,或者使用更具体的命令来复制它们。复制文件,保留所有属性:
cp -a source_file destination_file
在这个例子中,即使你只是在复制一个文件,
-a
选项也会确保文件的权限、所有权、时间戳等属性都被保留。然而,对于单个文件来说,通常不需要-a
的所有功能,因此你可能只会使用-p
(保留文件属性)或默认行为(不添加任何特定选项)。不过,使用-a
也不会有问题,它只是提供了额外的保证。
CentOS7.9的 cp --help
用法:cp [选项]... [-T] 源文件 目标文件
或:cp [选项]... 源文件... 目录
或:cp [选项]... -t 目录 源文件...
Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.
Mandatory arguments to long options are mandatory for short options too.
-a, --archive 等于-dR --preserve=all
--attributes-only 仅复制属性而不复制数据 --backup[=CONTROL 为每个已存在的目标文件创建备份
-b 类似--backup 但不接受参数
--copy-contents 在递归处理是复制特殊文件内容
-d 等于--no-dereference --preserve=links
-f, --force if an existing destination file cannot be
opened, remove it and try again (this option
is ignored when the -n option is also used)
-i, --interactive prompt before overwrite (overrides a previous -n
option)
-H follow command-line symbolic links in SOURCE
-l, --link hard link files instead of copying
-L, --dereference always follow symbolic links in SOURCE
-n, --no-clobber 不要覆盖已存在的文件(使前面的 -i 选项失效)
-P, --no-dereference 不跟随源文件中的符号链接
-p 等于--preserve=模式,所有权,时间戳
--preserve[=属性列表 保持指定的属性(默认:模式,所有权,时间戳),如果
可能保持附加属性:环境、链接、xattr 等
-c deprecated, same as --preserve=context
--sno-preserve=属性列表 不保留指定的文件属性
--parents 复制前在目标目录创建来源文件路径中的所有目录
-R, -r, --recursive 递归复制目录及其子目录内的所有内容
--reflink[=WHEN] 控制克隆/CoW 副本。请查看下面的内如。
--remove-destination 尝试打开目标文件前先删除已存在的目的地
文件 (相对于 --force 选项)
--sparse=WHEN 控制创建稀疏文件的方式
--strip-trailing-slashes 删除参数中所有源文件/目录末端的斜杠
-s, --symbolic-link 只创建符号链接而不复制文件
-S, --suffix=后缀 自行指定备份文件的后缀
-t, --target-directory=目录 将所有参数指定的源文件/目录
复制至目标目录
-T, --no-target-directory 将目标目录视作普通文件
-u, --update 只在源文件比目标文件新,或目标文件
不存在时才进行复制
-v, --verbose 显示详细的进行步骤
-x, --one-file-system 不跨越文件系统进行操作
-Z set SELinux security context of destination
file to default type
--context[=CTX] like -Z, or if CTX is specified then set the
SELinux or SMACK security context to CTX
--help 显示此帮助信息并退出
--version 显示版本信息并退出
默认情况下,源文件的稀疏性仅仅通过简单的方法判断,对应的目标文件目标文件也
被为稀疏。这是因为默认情况下使用了--sparse=auto 参数。如果明确使用
--sparse=always 参数则不论源文件是否包含足够长的0 序列也将目标文件创文
建为稀疏件。
使用--sparse=never 参数禁止创建稀疏文件。
当指定了--reflink[=always] 参数时执行轻量化的复制,即只在数据块被修改的
情况下才复制。如果复制失败或者同时指定了--reflink=auto,则返回标准复制模式。
The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.
The version control method may be selected via the --backup option or through
the VERSION_CONTROL environment variable. Here are the values:
none, off 不进行备份(即使使用了--backup 选项)
numbered, t 备份文件加上数字进行排序
existing, nil 若有数字的备份文件已经存在则使用数字,否则使用普通方式备份
simple, never 永远使用普通方式备份
有一个特别情况:如果同时指定--force 和--backup 选项,而源文件和目标文件
是同一个已存在的一般文件的话,cp 会将源文件备份。
GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
请向<http://translationproject.org/team/zh_CN.html> 报告cp 的翻译错误
要获取完整文档,请运行:info coreutils 'cp invocation'
Fedora40 的 cp --help
用法:cp [选项]... [-T] 源 目标
或:cp [选项]... 源... 目录
或:cp [选项]... -t 目录 源...
将 <源> 复制至 <目标>,或将多个 <源> 复制至 <目录>。
长选项的必选参数对于短选项也是必选的。
-a, --archive 等于 -dR --preserve=all
--attributes-only 仅复制属性而不复制文件数据
--backup[=控制] 为每个已存在的目标文件创建备份
-b 类似 --backup 但不接受参数
--copy-contents 在递归操作时复制特殊文件的内容
-d 等于 --no-dereference --preserve=links
--debug 解释文件是如何复制的。隐含启用 -v
-f, --force 如果已存在的目标文件无法打开,则将其删除并重试
(该选项在与 -n 选项同时使用时将被忽略)
-i, --interactive 覆盖前询问(使前面的 -n 选项失效)
-H 跟随命令行里的 <源> 中的符号链接
-l, --link 硬链接文件以代替复制
-L, --dereference 总是跟随 <源> 里的符号链接
-n, --no-clobber 不要覆盖已存在的文件(使 -u 和前面的 -i 选项
失效)。参见 --update
-P, --no-dereference 从不跟随 <源> 里的符号链接
-p 等于--preserve=mode,ownership,timestamps
--preserve[=属性列表] 保留指定的文件属性
--no-preserve=属性列表 不保留指定的属性
--parents 在 <目录> 下使用完整的源文件路径
-R, -r, --recursive 递归地复制目录
--reflink[=何时] 控制克隆/CoW 副本。见下文
--remove-destination 尝试打开目标文件前先删除已存在的目标
文件(和 --force 选项有区别)
--sparse=何时 控制创建稀疏文件的方式。见下文
--strip-trailing-slashes 删除参数中所有 <源> 末尾的斜杠
-s, --symbolic-link 只创建符号链接而不复制文件
-S, --suffix=后缀 自行指定备份文件的后缀
-t, --target-directory=目录 将所有 <源> 参数复制到 <目录>
-T, --no-target-directory 将 <目标> 视为普通文件
--update[=更新] 控制更新哪些已存在的文件;
<更新>={all,none,older(默认)}。见下
-u 等价于 --update[=older]
-v, --verbose 显示详细步骤
-x, --one-file-system 仅在此文件系统上进行操作
-Z 设置目标文件的 SELinux 安全上下文为默认类型
--context[=上下文] 类似 -Z,但如果指定了 <上下文>,则将 SELinux
或 SMACK 安全上下文设置为 <上下文>
--help 显示此帮助信息并退出
--version 显示版本信息并退出
<属性列表> 是用逗号分隔的属性列表。可用的属性有:"mode" 表示权限(包括所有 ACL
和 xattr 权限)、"ownership" 表示所有者和属组、"timestamps" 表示文件时间戳、
"links" 表示硬链接、"context" 表示安全上下文、"xattr" 表示扩展属性,以及
"all" 表示所有属性。
默认情况下,将通过简单的启发式算法检测稀疏的 <源> 文件,并将对应的 <目标>
文件设为稀疏。这也是 --sparse=auto 的行为。若使用 --sparse=always,则只要
<源> 文件包含了足够长的零字节序列,都会将 <目标> 文件创建为稀疏文件。
使用 --sparse=never 可以禁止创建稀疏文件。
<更新> 控制替换目标中的哪些已存在的文件。
"all" 在未指定 --update 选项时是默认操作,会替换目标中所有已存在的文件。
"none" 和 --no-clobber 选项类似,不会替换目标中的任何文件,区别在于跳过文件
不会使命令失败。
"older" 在指定了 --update 选项时是默认操作,会替换目标中比对应的源文件
更旧的文件。
当指定了 --reflink[=always] 参数时,将进行轻量级复制,此时数据块只在被修改时
进行复制。如果因无法进行这种复制而导致复制失败,或者指定了 --reflink=auto,
程序将会回退到标准复制操作。使用 --reflink=never 可以确保永远进行标准复制。
备份文件的后缀为 "~",除非使用了 --suffix 选项或 SIMPLE_BACKUP_SUFFIX 环境变量
指定了其他后缀。版本控制的方式可通过 --backup 选项或 VERSION_CONTROL 环境变量
来选择。以下是可用的设置值:
none, off 不进行备份(即使使用了 --backup 选项)
numbered, t 使用带有数字编号的备份文件进行备份
existing, nil 若带数字的备份文件已经存在则使用 numbered,否则使用 simple
simple, never 总是使用简单方式进行备份
有一个特殊情况:如果同时指定 --force 和 --backup 选项,而 <源> 和 <目标>
是同一个已存在的普通文件的话,cp 会对 <源> 进行备份。
GNU coreutils 在线帮助:<https://www.gnu.org/software/coreutils/>
请向 <http://translationproject.org/team/zh_CN.html> 报告任何翻译错误
完整文档 <https://www.gnu.org/software/coreutils/cp>
或者在本地使用:info '(coreutils) cp invocation'
Ubuntu24.04Desktop 的 cp --help
用法:cp [选项]... [-T] 源 目标
或:cp [选项]... 源... 目录
或:cp [选项]... -t 目录 源...
将 <源> 复制至 <目标>,或将多个 <源> 复制至 <目录>。
长选项的必选参数对于短选项也是必选的。
-a, --archive 等于 -dR --preserve=all
--attributes-only 仅复制属性而不复制文件数据
--backup[=控制] 为每个已存在的目标文件创建备份
-b 类似 --backup 但不接受参数
--copy-contents 在递归操作时复制特殊文件的内容
-d 等于 --no-dereference --preserve=links
--debug 解释文件是如何复制的。隐含启用 -v
-f, --force 如果已存在的目标文件无法打开,则将其删除并重试
(该选项在与 -n 选项同时使用时将被忽略)
-i, --interactive 覆盖前询问(使前面的 -n 选项失效)
-H 跟随命令行里的 <源> 中的符号链接
-l, --link 硬链接文件以代替复制
-L, --dereference 总是跟随 <源> 里的符号链接
-n, --no-clobber do not overwrite an existing file and do not fail
(overrides a -u or previous -i option). See also
--update; equivalent to --update=none.
-P, --no-dereference 从不跟随 <源> 里的符号链接
-p 等于--preserve=mode,ownership,timestamps
--preserve[=属性列表] 保留指定的文件属性
--no-preserve=属性列表 不保留指定的属性
--parents 在 <目录> 下使用完整的源文件路径
-R, -r, --recursive 递归地复制目录
--reflink[=何时] 控制克隆/CoW 副本。见下文
--remove-destination 尝试打开目标文件前先删除已存在的目标
文件(和 --force 选项有区别)
--sparse=何时 控制创建稀疏文件的方式。见下文
--strip-trailing-slashes 删除参数中所有 <源> 末尾的斜杠
-s, --symbolic-link 只创建符号链接而不复制文件
-S, --suffix=后缀 自行指定备份文件的后缀
-t, --target-directory=目录 将所有 <源> 参数复制到 <目录>
-T, --no-target-directory 将 <目标> 视为普通文件
--update[=更新] 控制更新哪些已存在的文件;
<更新>={all,none,older(默认)}。见下
-u 等价于 --update[=older]
-v, --verbose 显示详细步骤
-x, --one-file-system 仅在此文件系统上进行操作
-Z 设置目标文件的 SELinux 安全上下文为默认类型
--context[=上下文] 类似 -Z,但如果指定了 <上下文>,则将 SELinux
或 SMACK 安全上下文设置为 <上下文>
--help 显示此帮助信息并退出
--version 显示版本信息并退出
<属性列表> 是用逗号分隔的属性列表。可用的属性有:"mode" 表示权限(包括所有 ACL
和 xattr 权限)、"ownership" 表示所有者和属组、"timestamps" 表示文件时间戳、
"links" 表示硬链接、"context" 表示安全上下文、"xattr" 表示扩展属性,以及
"all" 表示所有属性。
默认情况下,将通过简单的启发式算法检测稀疏的 <源> 文件,并将对应的 <目标>
文件设为稀疏。这也是 --sparse=auto 的行为。若使用 --sparse=always,则只要
<源> 文件包含了足够长的零字节序列,都会将 <目标> 文件创建为稀疏文件。
使用 --sparse=never 可以禁止创建稀疏文件。
<更新> 控制替换目标中的哪些已存在的文件。
"all" 在未指定 --update 选项时是默认操作,会替换目标中所有已存在的文件。
"none" 和 --no-clobber 选项类似,不会替换目标中的任何文件,区别在于跳过文件
不会使命令失败。
"older" 在指定了 --update 选项时是默认操作,会替换目标中比对应的源文件
更旧的文件。
当指定了 --reflink[=always] 参数时,将进行轻量级复制,此时数据块只在被修改时
进行复制。如果因无法进行这种复制而导致复制失败,或者指定了 --reflink=auto,
程序将会回退到标准复制操作。使用 --reflink=never 可以确保永远进行标准复制。
备份文件的后缀为 "~",除非使用了 --suffix 选项或 SIMPLE_BACKUP_SUFFIX 环境变量
指定了其他后缀。版本控制的方式可通过 --backup 选项或 VERSION_CONTROL 环境变量
来选择。以下是可用的设置值:
none, off 不进行备份(即使使用了 --backup 选项)
numbered, t 使用带有数字编号的备份文件进行备份
existing, nil 若带数字的备份文件已经存在则使用 numbered,否则使用 simple
simple, never 总是使用简单方式进行备份
有一个特殊情况:如果同时指定 --force 和 --backup 选项,而 <源> 和 <目标>
是同一个已存在的普通文件的话,cp 会对 <源> 进行备份。
GNU coreutils 在线帮助:<https://www.gnu.org/software/coreutils/>
请向 <http://translationproject.org/team/zh_CN.html> 报告任何翻译错误
完整文档 <https://www.gnu.org/software/coreutils/cp>
或者在本地使用:info '(coreutils) cp invocation'
Ubuntu20.04.6 的 cp --help
用法:cp [选项]... [-T] 源文件 目标文件
或:cp [选项]... 源文件... 目录
或:cp [选项]... -t 目录 源文件...
将指定<源文件>复制至<目标文件>,或将多个<源文件>复制至<目标目录>。
必选参数对长短选项同时适用。
-a, --archive 等于-dR --preserve=all
--attributes-only 仅复制属性而不复制数据 --backup[=CONTROL 为每个已存在的目标文件创建备份
-b 类似--backup 但不接受参数
--copy-contents 在递归处理是复制特殊文件内容
-d 等于--no-dereference --preserve=links
-f, --force 如果有已存在的目标文件且无法打开,则将其删除并重试
(该选项在与 -n 选项同时使用时将被忽略)
-i, --interactive 覆盖前询问(使前面的 -n 选项失效)
-H 跟随源文件中的命令行符号链接
-l, --link 硬链接文件以代替复制
-L, --dereference 总是跟随源文件中的符号链接
-n, --no-clobber 不要覆盖已存在的文件(使前面的 -i 选项失效)
-P, --no-dereference 不跟随源文件中的符号链接
-p 等于--preserve=模式,所有权,时间戳
--preserve[=属性列表 保持指定的属性(默认:模式,所有权,时间戳),如果
可能保持附加属性:上下文、链接、xattr 等
--sno-preserve=属性列表 不保留指定的文件属性
--parents 复制前在目标目录创建来源文件路径中的所有目录
-R, -r, --recursive 递归复制目录及其子目录内的所有内容
--reflink[=WHEN] 控制克隆/CoW 副本。请查看下面的内如。
--remove-destination 尝试打开目标文件前先删除已存在的目的地
文件 (相对于 --force 选项)
--sparse=WHEN 控制创建稀疏文件的方式
--strip-trailing-slashes 删除参数中所有源文件/目录末端的斜杠
-s, --symbolic-link 只创建符号链接而不复制文件
-S, --suffix=后缀 自行指定备份文件的后缀
-t, --target-directory=目录 将所有参数指定的源文件/目录
复制至目标目录
-T, --no-target-directory 将目标目录视作普通文件
-u, --update 只在源文件比目标文件新,或目标文件
不存在时才进行复制
-v, --verbose 显示详细的进行步骤
-x, --one-file-system 不跨越文件系统进行操作
-Z 设置目标文件的 SELinux 安全上下文为默认类型
--context[=上下文] 类似 -Z;如果指定了上下文,则将 SELinux 或
SMACK 安全上下文设置为指定值
--help 显示此帮助信息并退出
--version 显示版本信息并退出
默认情况下,源文件的稀疏性仅仅通过简单的方法判断,对应的目标文件目标文件
也将设为稀疏。这是因为默认情况下使用了--sparse=auto 参数。如果明确使用
--sparse=always 参数,则不论源文件是否包含足够长的 0 序列,都会将目标文件
创建为稀疏文件。使用 --sparse=never 参数可以禁止创建稀疏文件。
当指定了 --reflink[=always] 参数时,将进行轻量级复制,此时数据块只在被修改时
进行复制,如果无法如此操作则复制将会失败。或者如果指定了 --reflink=auto,程序
将会回退到标准复制操作。使用 --reflink=never 可以确保永远进行标准复制。
备份文件的后缀为"~",除非以--suffix 选项或是 SIMPLE_BACKUP_SUFFIX
环境变量指定。版本控制的方式可通过--backup 选项或 VERSION_CONTROL 环境
变量来选择。以下是可用的变量值:
none, off 不进行备份(即使使用了--backup 选项)
numbered, t 备份文件加上数字进行排序
existing, nil 若有数字的备份文件已经存在则使用数字,否则使用普通方式备份
simple, never 永远使用普通方式备份
有一个特别情况:如果同时指定--force 和--backup 选项,而源文件和目标文件
是同一个已存在的一般文件的话,cp 会将源文件备份。
GNU coreutils 在线帮助:<https://www.gnu.org/software/coreutils/>
请向 <http://translationproject.org/team/zh_CN.html> 报告 cp 的翻译错误
完整文档请见:<https://www.gnu.org/software/coreutils/cp>
或者在本地使用:info '(coreutils) cp invocation'