一、cp 命令简介

Centos7 自带的 cp、mv 命令是不支持 显示进度的,可以使用cp --help查看

[root@server2 ~]# 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         显示版本信息并退出

···此处省略内容

因此需要另外安装一个 CP 来实现进度的显示

二、环境准备

我使用的版本是 centos7.4,个人认为 centos7 和 8 都可以,6 没有试过

2.1 系统环境

查看系统内核
[root@server2 ~]# uname -a
Linux server2 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

查看系统版本
[root@server2 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core) 
[root@server2 ~]# 

2.2 文件下载

① coreutils-8.32.tar.gz 链接
https://pan.baidu.com/s/1BTmYDOmyB5dGck89tMOIzw
提取码:zxcv
② 插件链接
https://pan.baidu.com/s/1BL5acckVfk9jZJFQwNMBgg
提取码:zxcv

下载后将两个文件上传到 / opt 目录下面(如何上传可以自行解决)

在 centos 系统里coreutils-8.32.tar.gz压缩包所在的目录进行操作

tar -xf coreutils-8.32.tar.gz -C /opt/

如下图所示

PS:这里的文件是已经解压好的

三、安装

3.1 安装依赖环境

[root@server2 ~]# yum -y install gcc
[root@server2 ~]# yum -y install patch

3.2 配置环境变量

[root@server2 ~]# export FORCE_UNSAFE_CONFIGURE=1

3.3 配置安装内容

[root@server2 ~]# cd /opt/coreutils-8.32/
[root@server2 ~]# patch -p1 -i /opt/advcpmv-0.8-8.32.patch
[root@server2 ~]# ./configure && make

3.4 复制命令

为了不与 cp 命令冲突,这里将新安装的 cp 命令重名为 cpg
(cpg 没有什么特殊意义,就是自己起的名字,也可以重名为其它名字)

[root@server2 ~]# cp /opt/coreutils-8.32/src/cp /usr/local/bin/cpg
[root@server2 ~]# cp /opt/coreutils-8.32/src/mv /usr/local/bin/mvg

解释
/usr/bin 为内部命令
/usr/local/bin 为外部命令

四、测试

4.1 cpg 测试

常用选项

-g 显示进度
-r 归档

4.2 mvg 测试