Linux|shell编程|拷贝大文件之显示进度条

news2024/11/28 16:52:59

前言:

Linux由于自身并不是一个图形化的界面,因此,命令行是它的一个基础交互模式,而我们有的时候需要进度条来让程序运行的更加美观,更加直观,例如,一些比较消耗io的操作,文件拷贝,比如某个文件十几G甚至上百G,需要拷贝到本机的其它分区,那么,一个直观的进度条就十分有用了,可以让我们大致估算出多少时间拷贝完成,从而进行下一步的工作。

那么,本文将以一个10G的文件拷贝为例,输出一个按实际拷贝进度来显示的进度条。

一,

测试文件的准备

time命令统计dd命令的执行时间,可以看到用时1分钟6秒,硬盘速度161M每秒。

我的硬盘速度还算可以的

[root@centos61 ~]# time dd if=/dev/zero of=Demofile bs=100M count=100 
100+0 records in
100+0 records out
10485760000 bytes (10 GB) copied, 65.3247 s, 161 MB/s

real	1m5.869s
user	0m0.001s
sys	0m13.644s

[root@centos61 ~]# ls -alh Demofile 
-rw-r--r--. 1 root root 9.8G May 27 17:41 Demofile

二,

带实际拷贝进度的进度条的shell脚本(本文暂定该脚本名称为copyfile.sh):

#!/bin/bash

SOURCE=$1
TARGET=$2
CP=cp
$CP "$SOURCE" "$TARGET" &
CPID=$!
trap "onCtrlC" INT 
function onCtrlC () {
        #捕获CTRL+C,当脚本被ctrl+c的形式终止时同时终止程序的后台进程
        kill -9 ${isalive} ${CPID}
        echo
        echo 'Ctrl+C is captured,拷贝已停止'
        exit 1
}

isalive(){
        out=`ps -p $1 2> /dev/null`
        return $?
}

while 2>1; do
 { SSIZE=`/bin/ls -l $SOURCE | gawk "{print \\\$5}"`
        if [ -f $TARGET ]; then
                TSIZE=`/bin/ls -l $TARGET | gawk "{print \\\$5}"`
        else
                TSIZE="0"
        fi
        PERCENT=`echo "scale=2; $TSIZE/$SSIZE*100" | bc -l`
        RATE=`echo "scale=0; 63*$PERCENT/100" | bc -l`
        BLUE="\\033[3;44m"
        NORMAIL="\\033[0;39m"

        BAR=$BLUE
        i=0
        while [ $i -le 62 ]; do
                [ $i = $RATE ] && BAR=$BAR"\\033[7;39m"
                BAR=$BAR" "
                let i=$i+1
        done
        BAR=$BAR$NORMAIL
        echo -en "\r$BAR ${PERCENT}%"
        if ! isalive "$CPID"; then echo -en "\n"; exit; fi
        sleep 1
}
done

脚本运行效果:

[root@centos61 ~]# bash copyfile.sh Demofile Demofile-bak
                                                                14.00%^C
Ctrl+C is captured,拷贝已停止

此时到百分之14的时候按ctrl+c停止了,我们可以核对一下目标文件是否是源文件的百分之14:

可以计算出1.5除以9.8确实是百分之14

[root@centos61 ~]# ls -alh Demofile*
-rw-r--r--. 1 root root 9.8G May 27 17:41 Demofile
-rw-r--r--. 1 root root 1.5G May 27 18:25 Demofile-bak

 shell脚本完美运行!!!!!!

完整运行:

[root@centos61 ~]# time bash copyfile.sh Demofile Demofile-bak
                                                                100.00%

real	2m6.804s
user	0m1.769s
sys	0m22.517s

[root@centos61 ~]# ls -al Demofile*
-rw-r--r--. 1 root root 10485760000 May 27 17:41 Demofile
-rw-r--r--. 1 root root 10485760000 May 27 18:36 Demofile-bak

 

 

三,

脚本说明:

  • $1 代表源文件,本例是Demofile,$2 代表目标文件,本例是Demofile-bak
  • 实际的拷贝命令是在后台运行,因为前台需要显示的是进度条,因此是$CP "$SOURCE" "$TARGET" &

trap "onCtrlC" INT
function onCtrlC () {
        #捕获CTRL+C,当脚本被ctrl+c的形式终止时同时终止程序的后台进程
        kill -9 ${isalive} ${CPID}
        echo
        echo 'Ctrl+C is captured,拷贝已停止'
        exit 1
}

 

这一块是抓取中断信号,如果不想拷贝了的情况下,ctrl+c停止脚本,这样会使得脚本退出更为优雅。

isalive(){
        out=`ps -p $1 2> /dev/null`
        return $?
}

 

这一块是监听拷贝程序的 pid,当返回值为1的时候,表示拷贝完成,程序停止退出。

一个循环的debug如下:

++ ps -p 35785
+ out='   PID TTY          TIME CMD
 35785 pts/1    00:00:15 cp'
+ return 0
+ sleep 1
++ /bin/ls -l Demofile
++ gawk '{print $5}'
+ SSIZE=10485760000
+ '[' -f Demofile-bak ']'
++ /bin/ls -l Demofile-bak
++ gawk '{print $5}'
+ TSIZE=10337685504
++ echo 'scale=2; 10337685504/10485760000*100'
++ bc -l
+ PERCENT=98.00
++ echo 'scale=0; 63*98.00/100'
++ bc -l
+ RATE=61
+ BLUE='\033[3;44m'
+ NORMAIL='\033[0;39m'
+ BAR='\033[3;44m'
+ i=0
+ '[' 0 -le 62 ']'
+ '[' 0 = 61 ']'
+ BAR='\033[3;44m '
+ let i=0+1
+ '[' 1 -le 62 ']'
+ '[' 1 = 61 ']'
+ BAR='\033[3;44m  '
+ let i=1+1
+ '[' 2 -le 62 ']'
+ '[' 2 = 61 ']'
+ BAR='\033[3;44m   '
+ let i=2+1
+ '[' 3 -le 62 ']'
+ '[' 3 = 61 ']'
+ BAR='\033[3;44m    '
+ let i=3+1
+ '[' 4 -le 62 ']'
+ '[' 4 = 61 ']'
+ BAR='\033[3;44m     '
+ let i=4+1
+ '[' 5 -le 62 ']'
+ '[' 5 = 61 ']'
+ BAR='\033[3;44m      '
+ let i=5+1
+ '[' 6 -le 62 ']'
+ '[' 6 = 61 ']'
+ BAR='\033[3;44m       '
+ let i=6+1
+ '[' 7 -le 62 ']'
+ '[' 7 = 61 ']'
+ BAR='\033[3;44m        '
+ let i=7+1
+ '[' 8 -le 62 ']'
+ '[' 8 = 61 ']'
+ BAR='\033[3;44m         '
+ let i=8+1
+ '[' 9 -le 62 ']'
+ '[' 9 = 61 ']'
+ BAR='\033[3;44m          '
+ let i=9+1
+ '[' 10 -le 62 ']'
+ '[' 10 = 61 ']'
+ BAR='\033[3;44m           '
+ let i=10+1
+ '[' 11 -le 62 ']'
+ '[' 11 = 61 ']'
+ BAR='\033[3;44m            '
+ let i=11+1
+ '[' 12 -le 62 ']'
+ '[' 12 = 61 ']'
+ BAR='\033[3;44m             '
+ let i=12+1
+ '[' 13 -le 62 ']'
+ '[' 13 = 61 ']'
+ BAR='\033[3;44m              '
+ let i=13+1
+ '[' 14 -le 62 ']'
+ '[' 14 = 61 ']'
+ BAR='\033[3;44m               '
+ let i=14+1
+ '[' 15 -le 62 ']'
+ '[' 15 = 61 ']'
+ BAR='\033[3;44m                '
+ let i=15+1
+ '[' 16 -le 62 ']'
+ '[' 16 = 61 ']'
+ BAR='\033[3;44m                 '
+ let i=16+1
+ '[' 17 -le 62 ']'
+ '[' 17 = 61 ']'
+ BAR='\033[3;44m                  '
+ let i=17+1
+ '[' 18 -le 62 ']'
+ '[' 18 = 61 ']'
+ BAR='\033[3;44m                   '
+ let i=18+1
+ '[' 19 -le 62 ']'
+ '[' 19 = 61 ']'
+ BAR='\033[3;44m                    '
+ let i=19+1
+ '[' 20 -le 62 ']'
+ '[' 20 = 61 ']'
+ BAR='\033[3;44m                     '
+ let i=20+1
+ '[' 21 -le 62 ']'
+ '[' 21 = 61 ']'
+ BAR='\033[3;44m                      '
+ let i=21+1
+ '[' 22 -le 62 ']'
+ '[' 22 = 61 ']'
+ BAR='\033[3;44m                       '
+ let i=22+1
+ '[' 23 -le 62 ']'
+ '[' 23 = 61 ']'
+ BAR='\033[3;44m                        '
+ let i=23+1
+ '[' 24 -le 62 ']'
+ '[' 24 = 61 ']'
+ BAR='\033[3;44m                         '
+ let i=24+1
+ '[' 25 -le 62 ']'
+ '[' 25 = 61 ']'
+ BAR='\033[3;44m                          '
+ let i=25+1
+ '[' 26 -le 62 ']'
+ '[' 26 = 61 ']'
+ BAR='\033[3;44m                           '
+ let i=26+1
+ '[' 27 -le 62 ']'
+ '[' 27 = 61 ']'
+ BAR='\033[3;44m                            '
+ let i=27+1
+ '[' 28 -le 62 ']'
+ '[' 28 = 61 ']'
+ BAR='\033[3;44m                             '
+ let i=28+1
+ '[' 29 -le 62 ']'
+ '[' 29 = 61 ']'
+ BAR='\033[3;44m                              '
+ let i=29+1
+ '[' 30 -le 62 ']'
+ '[' 30 = 61 ']'
+ BAR='\033[3;44m                               '
+ let i=30+1
+ '[' 31 -le 62 ']'
+ '[' 31 = 61 ']'
+ BAR='\033[3;44m                                '
+ let i=31+1
+ '[' 32 -le 62 ']'
+ '[' 32 = 61 ']'
+ BAR='\033[3;44m                                 '
+ let i=32+1
+ '[' 33 -le 62 ']'
+ '[' 33 = 61 ']'
+ BAR='\033[3;44m                                  '
+ let i=33+1
+ '[' 34 -le 62 ']'
+ '[' 34 = 61 ']'
+ BAR='\033[3;44m                                   '
+ let i=34+1
+ '[' 35 -le 62 ']'
+ '[' 35 = 61 ']'
+ BAR='\033[3;44m                                    '
+ let i=35+1
+ '[' 36 -le 62 ']'
+ '[' 36 = 61 ']'
+ BAR='\033[3;44m                                     '
+ let i=36+1
+ '[' 37 -le 62 ']'
+ '[' 37 = 61 ']'
+ BAR='\033[3;44m                                      '
+ let i=37+1
+ '[' 38 -le 62 ']'
+ '[' 38 = 61 ']'
+ BAR='\033[3;44m                                       '
+ let i=38+1
+ '[' 39 -le 62 ']'
+ '[' 39 = 61 ']'
+ BAR='\033[3;44m                                        '
+ let i=39+1
+ '[' 40 -le 62 ']'
+ '[' 40 = 61 ']'
+ BAR='\033[3;44m                                         '
+ let i=40+1
+ '[' 41 -le 62 ']'
+ '[' 41 = 61 ']'
+ BAR='\033[3;44m                                          '
+ let i=41+1
+ '[' 42 -le 62 ']'
+ '[' 42 = 61 ']'
+ BAR='\033[3;44m                                           '
+ let i=42+1
+ '[' 43 -le 62 ']'
+ '[' 43 = 61 ']'
+ BAR='\033[3;44m                                            '
+ let i=43+1
+ '[' 44 -le 62 ']'
+ '[' 44 = 61 ']'
+ BAR='\033[3;44m                                             '
+ let i=44+1
+ '[' 45 -le 62 ']'
+ '[' 45 = 61 ']'
+ BAR='\033[3;44m                                              '
+ let i=45+1
+ '[' 46 -le 62 ']'
+ '[' 46 = 61 ']'
+ BAR='\033[3;44m                                               '
+ let i=46+1
+ '[' 47 -le 62 ']'
+ '[' 47 = 61 ']'
+ BAR='\033[3;44m                                                '
+ let i=47+1
+ '[' 48 -le 62 ']'
+ '[' 48 = 61 ']'
+ BAR='\033[3;44m                                                 '
+ let i=48+1
+ '[' 49 -le 62 ']'
+ '[' 49 = 61 ']'
+ BAR='\033[3;44m                                                  '
+ let i=49+1
+ '[' 50 -le 62 ']'
+ '[' 50 = 61 ']'
+ BAR='\033[3;44m                                                   '
+ let i=50+1
+ '[' 51 -le 62 ']'
+ '[' 51 = 61 ']'
+ BAR='\033[3;44m                                                    '
+ let i=51+1
+ '[' 52 -le 62 ']'
+ '[' 52 = 61 ']'
+ BAR='\033[3;44m                                                     '
+ let i=52+1
+ '[' 53 -le 62 ']'
+ '[' 53 = 61 ']'
+ BAR='\033[3;44m                                                      '
+ let i=53+1
+ '[' 54 -le 62 ']'
+ '[' 54 = 61 ']'
+ BAR='\033[3;44m                                                       '
+ let i=54+1
+ '[' 55 -le 62 ']'
+ '[' 55 = 61 ']'
+ BAR='\033[3;44m                                                        '
+ let i=55+1
+ '[' 56 -le 62 ']'
+ '[' 56 = 61 ']'
+ BAR='\033[3;44m                                                         '
+ let i=56+1
+ '[' 57 -le 62 ']'
+ '[' 57 = 61 ']'
+ BAR='\033[3;44m                                                          '
+ let i=57+1
+ '[' 58 -le 62 ']'
+ '[' 58 = 61 ']'
+ BAR='\033[3;44m                                                           '
+ let i=58+1
+ '[' 59 -le 62 ']'
+ '[' 59 = 61 ']'
+ BAR='\033[3;44m                                                            '
+ let i=59+1
+ '[' 60 -le 62 ']'
+ '[' 60 = 61 ']'
+ BAR='\033[3;44m                                                             '
+ let i=60+1
+ '[' 61 -le 62 ']'
+ '[' 61 = 61 ']'
+ BAR='\033[3;44m                                                             \033[7;39m'
+ BAR='\033[3;44m                                                             \033[7;39m '
+ let i=61+1
+ '[' 62 -le 62 ']'
+ '[' 62 = 61 ']'
+ BAR='\033[3;44m                                                             \033[7;39m  '
+ let i=62+1
+ '[' 63 -le 62 ']'
+ BAR='\033[3;44m                                                             \033[7;39m  \033[0;39m'
+ echo -en '\r\033[3;44m                                                             \033[7;39m  \033[0;39m 98.00%'
                                                                98.00%+ isalive 35785

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/576765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机操作系统第四版第八章磁盘存储器的管理—课后习题答案

1.目前常用的外存有哪几种组织方式? (1)连续组织方式。为每一个文件分配--组位置相邻接的盘块,由此形成的文件物理结构是顺序式的文件结构。 (2)链接组织方式。为每个文件分配一组位置离散的盘块,通过给每个盘块设置一个指针,将属于同-一个文件的盘块链…

【SDP协议】

SDP 1.概念2术语2.1 SERVICE ATTRIBUTE2.3 UUID 3 数据表示3.2 hci log4.4.4.3 PARTIAL RESPONSES AND CONTINUATION STATE4.4.4.4 ERROR HANDLING4.4.4.5 SERVICE SEARCH TRANSACTION4.4.4.6 SERVICE ATTRIBUTE TRANSACTION4.4.4.3 SERVICE SEARCH ATTRIBUTE TRANSACTION4.4.4…

【密码学复习】第九讲 密钥管理(二)

公钥的分发问题 广播式公钥分发:任意通信方将它的公钥发送给另一方或广播给其他通信各方。 目录式公钥分发:由可信机构维护一个公开、动态、可访问的公开密钥目录。可以通过可信渠道到可信机构登记并申请增、删、改自己的公钥。其他人可以基于公开…

ARM的七种工作模式

分类 ARM的工作模式分为普通模式、特权模式,其中特权模式又细分为六种模式。 普通模式用户模式(User)大部分任务执行在这种模式 特权模式快速中断模式FIQ当一个高优先级(fast) 中断产生时将会进入这种模式普通中断模式IRQ当一个…

数据库基础——4.select语句

这篇文章我们来讲一下select语句,这是数据库中最最重要的一个关键字 目录 1.select的基本用法 1.1 select的基本用法 1.2 列的别名 1.3 去重查询 1.4 空值参与运算 1.5 着重号 1.6 查询常数 1.7 条件查询 2. 查看表结构 1.select的基本用法 1.1 select的…

12. 测试搭建百万并发项目

本文利用四台虚拟机,实现了百万并发的项目,并解决其中遇到的一些问题 一、百万并发项目 准备4个虚拟机,其中一个4G内存,2核CPU;另外三个2G内存,1核CPU。 在服务器中运行11节的代码,客户端中运…

分享一个500页面给大家

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>500页面</title><style>body,html {padding: 0;margin: 0;font-family: Quicksand, sans-s…

学生端程序(极域电子教室)破解方法

今天信息课上&#xff0c;由于老师的电脑控制&#xff08;极域电子教室&#xff09;导致某些同学无法摸鱼&#xff0c;于是他们就想让我破解&#xff0c;这道不难&#xff0c;我也就使用了三四周就破解出来了&#xff0c;今天就来和大家分享一下极域电子教室的破解方法 目录 …

(四)调整PID控制器参数的指南

一、控制系统设计快速入门和环境 首先确定一下控制任务。快速、精准地控制&#xff0c;必要的稳定性&#xff0c;时域&#xff08;上升时间、超调等&#xff09;&#xff0c;频域&#xff08;带宽、阻尼比&#xff09;然后明白控制系统特点。类积分器&#xff1f;开环稳定性、高…

深度学习实战项目(三)-行人检测重识别yolov5+reid(跑通+界面设计)

行人检测重识别yolov5reid&#xff08;跑通界面设计&#xff09; 参考源代码: github 权重文件&#xff1a; 根据github上面的网盘进行权重下载&#xff1a; 检测&#xff1a;将 ReID_resnet50_ibn_a.pth放在person_search/weights文件下&#xff0c;yolov5s.pt放person_sear…

pytest之fixture

fixture 0、文档1、局部前置处理2、全局前置处理3、全局前置处理 0、文档 pytest-fixture fixture 1、局部前置处理 pytest.fixture() 装饰器用于声明函数是一个fixture&#xff0c;该fixture的名字默认为函数名&#xff0c;也可以自己指定名称&#xff08;name取别名&#…

CBAM: Convolutional Block Attention Module论文总结和代码实现

论文&#xff1a;https://arxiv.org/pdf/1807.06521.pdf 中文版&#xff1a;CBAM: Convolutional Block Attention Module中文翻译 源码&#xff1a;https://github.com/Jongchan/attention-module 目录 一、论文的出发点 二、论文的主要工作 三、CBAM模块的具体实现 四…

【C++系列P5】‘类与对象‘-三部曲——[对象特殊成员](3/3)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 C系列 &#xff0c;热烈欢迎&#xff01; 【 类与对象-三部曲】的大纲主要内容如下&#xff1a; 如标题所示&#xff0c;本章是【 类与对象-三部曲】三章中的第三章节——对象&成员章节&#xff0c;主要内容如下&#xff1a; 目录…

1723_PolySpace Bug Finder命令行执行探索

全部学习汇总&#xff1a; GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes servral …

小兔鲜--项目总结3

目录 结算模块-地址切换交互实现 地址切换交互需求分析 打开弹框交互实现 地址激活交互实现 订单模块-生成订单功能实现 支付模块-实现支付功能 支付业务流程 支付模块-支付结果展示 支付模块-封装倒计时函数 理解需求 实现思路分析 会员中心-个人中心信息渲染 分页…

【JavaSE】Java基础语法(二十六):Collection集合

文章目录 1. 数组和集合的区别2. 集合类体系结构3. Collection 集合概述和使用【应用】4. Collection集合的遍历【应用】5. 增强for循环【应用】 1. 数组和集合的区别 相同点 都是容器,可以存储多个数据不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型…

【C++系列P4】‘类与对象‘-三部曲——[类](2/3)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 C系列 &#xff0c;热烈欢迎&#xff01; 【 类与对象-三部曲】的大纲主要内容如下&#xff1a; 如标题所示&#xff0c;本章是【 类与对象-三部曲】三章中的第二章节——类章节&#xff0c;主要内容如下&#xff1a; 目录 一.类 1.…

CodeForces..学习读书吧.[简单].[条件判断].[找最小值]

题目描述&#xff1a; 题目解读&#xff1a; 给定一组数&#xff0c;分别是 “时间 内容”&#xff0c;内容分为00&#xff0c;01&#xff0c;10&#xff0c;11四种&#xff0c;求能够得到11的最小时间。 解题思路&#xff1a; 看似00&#xff0c;01&#xff0c;10&#xff0…

完整卸载office以及重装office 2021

完整卸载office以及重装 一.背景 之前很早安装的word最近发现打开&#xff0c;编辑等操作都很卡&#xff0c;而且占用的CPU很多&#xff0c;20%左右&#xff0c;而在网上搜索了一些结果无法解决问题后&#xff0c;决定卸载重装 二. 卸载的建议方法 直接参考官方链接从PC卸载…

华为OD机试之租车骑绿岛(Java源码)

租车骑绿岛 题目描述 部门组织绿岛骑行团建活动。租用公共双人自行车&#xff0c;每辆自行车最多坐两人&#xff0c;最大载重M。 给出部门每个人的体重&#xff0c;请问最多需要租用多少双人自行车。 输入描述 第一行两个数字m、n&#xff0c;分别代表自行车限重&#xff0c;部…