Linux的shell的`cp`命令,常用`cp -a`

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_directorydestination_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命令的例子:

  1. 复制目录及其所有内容(包括子目录和文件),保留所有属性:

    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包含这些文件,或者使用更具体的命令来复制它们。

  2. 复制文件,保留所有属性:

    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'

  • 14
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kfepiza

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值