配置cpmv命令显示进度和速度

Posted 落叶寒鸦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了配置cpmv命令显示进度和速度相关的知识,希望对你有一定的参考价值。

Linux中cp和mv命令显示进度条和速度

Linux中,cp和mv命令都是由coreutils软件包安装的。

在Linux中cp或者mv命令操作大文件时,会出现等待的过程,但这两个命令都没有提供可以查看命令进度的参数,所以我们可以通过Github上的开源项目advcpmv来实现cp和mv命令在操作大文件的时候带上进度条。

1. 创建普通用户

全程必须使用普通用户操作并配置sudo,如果用root用户操作,后续编译安装会报错。

# 创建普通用户
useradd ord_user -g root

2. 配置sudo权限

切换到root用户,命令行输入 visudo ,即可直接进入/etc/sudoers 的编辑页面。

visudo

忽略掉其他配置信息,直接查看底部如下信息:

解释下每一列的含义:

  • 第一列表示用户名,如 rootubuntu 等;
  • 第二列,等号左边的 ALL 表示允许从任何主机登录当前的用户账户;
  • 第二列,等号右边的 ALL 表示:第一列的用户可以切换到系统中任何一个其它用户;
  • 第三列, ALL 表示:第一列的用户能以root用户的身份下达什么命令,ALL 表示可以下达任何命令。

如下配置方式在执行sudo时不需要提供密码:(去掉NOPASSWD:表示执行sudo时需要提供密码)

添加完毕,esc退出编辑,执行:wq,退出并保存。

3. 下载coreutils压缩包和补丁包

上传两个文件到普通用户家目录下。

cp&mv.zip

unzip cp&mv.zip
rm -f cp&mv.zip
ll

4. 编译安装

解压压缩包,要求必须有对应的编译软件,如gcc等才能正常编译。

tar xf coreutils-8.32.tar.xz
cd coreutils-8.32
mv ../advcpmv-0.8-8.32.patch .
patch -p1 -i advcpmv-0.8-8.32.patch
./configure

5. 复制cp和mv命令

将打补丁生成的cp和mv命令的二进制文件复制到/usr/local/bin/目录下,并设置命令别名。

sudo cp src/cp /usr/local/bin/cp
sudo cp src/mv /usr/local/bin/mv
echo "alias cp=\'cp -ig\'" >> ~/.bashrc
echo "alias mv=\'mv -ig\'" >> ~/.bashrc
source ~/.bashrc
alias

6. 创建大文件验证

使用dd命令创建一个5G的文件5g_test,验证命令可以显示进度和速度,并且在命令操作完后还会显示平均速度。

# 每次写入1024k,分5120次写入
dd if=/dev/zero of=5g_test bs=1024k count=5120
cp 5g_test 5g_test_cp
mv 5g_test /tmp

root用户想要使用值需要切换root设置别名。

echo "alias cp=\'cp -ig\'" >> ~/.bashrc
echo "alias mv=\'mv -ig\'" >> ~/.bashrc
source ~/.bashrc
alias

如何使用请求测量下载速度和进度?

【中文标题】如何使用请求测量下载速度和进度?【英文标题】:How to measure download speed and progress using requests? 【发布时间】:2014-01-15 01:34:41 【问题描述】:

我正在使用requests下载文件,但是对于大文件我每次都需要检查磁盘上文件的大小,因为我无法以百分比显示进度,我也想知道下载速度.我该怎么做呢?这是我的代码:

import requests
import sys
import time
import os

def downloadFile(url, directory) :
  localFilename = url.split('/')[-1]
  r = requests.get(url, stream=True)

  start = time.clock()
  f = open(directory + '/' + localFilename, 'wb')
  for chunk in r.iter_content(chunk_size = 512 * 1024) :
        if chunk :
              f.write(chunk)
              f.flush()
              os.fsync(f.fileno())
  f.close()
  return (time.clock() - start)

def main() :
  if len(sys.argv) > 1 :
        url = sys.argv[1]
  else :
        url = raw_input("Enter the URL : ")
  directory = raw_input("Where would you want to save the file ?")

  time_elapsed = downloadFile(url, directory)
  print "Download complete..."
  print "Time Elapsed: " + time_elapsed


if __name__ == "__main__" :
  main()

我认为一种方法是每次在for 循环中读取文件并根据标题Content-Length 计算进度百分比。但这对于大文件(大约 500MB)来说又是一个问题。还有其他方法吗?

【问题讨论】:

【参考方案1】:

请看这里:Python progress bar and downloads

我认为代码应该是这样的,它应该以每秒字节数的形式显示自启动以来的平均速度

import requests
import sys
import time

def downloadFile(url, directory) :
  localFilename = url.split('/')[-1]
  with open(directory + '/' + localFilename, 'wb') as f:
    start = time.clock()
    r = requests.get(url, stream=True)
    total_length = r.headers.get('content-length')
    dl = 0
    if total_length is None: # no content length header
      f.write(r.content)
    else:
      for chunk in r.iter_content(1024):
        dl += len(chunk)
        f.write(chunk)
        done = int(50 * dl / total_length)
        sys.stdout.write("\r[%s%s] %s bps" % ('=' * done, ' ' * (50-done), dl//(time.clock() - start)))
        print ''
  return (time.clock() - start)

def main() :
  if len(sys.argv) > 1 :
        url = sys.argv[1]
  else :
        url = raw_input("Enter the URL : ")
  directory = raw_input("Where would you want to save the file ?")

  time_elapsed = downloadFile(url, directory)
  print "Download complete..."
  print "Time Elapsed: " + time_elapsed


if __name__ == "__main__" :
  main()

【讨论】:

这段代码看起来不错,但 IMO 它不会显示动态下载,因为当我们请求 requests.get(...) 时,它会下载整个文件,然后它会退出 get 函数。这是动态功能。 @sonukumar,请注意 get 调用 request.get(url , stream=True) 中的 stream 参数。查看the documentation。 @freeforalltousez 计算下载百分比时乘以50是什么意思? @Juancho 这是进度条的长度。请参阅链接的答案。【参考方案2】:

使用io.Bytes(写入内存)的python3接受答案的改进版本,产生Mbps,支持ipv4/ipv6,大小和端口参数。

import sys, time, io, requests

def speed_test(size=5, ipv="ipv4", port=80):
    
    if size == 1024:
        size = "1GB"
    else:
        size = f"sizeMB"

    url = f"http://ipv.download.thinkbroadband.com:port/size.zip"

    with io.BytesIO() as f:
        start = time.clock()
        r = requests.get(url, stream=True)
        total_length = r.headers.get('content-length')
        dl = 0
        if total_length is None: # no content length header
            f.write(r.content)
        else:
            for chunk in r.iter_content(1024):
                dl += len(chunk)
                f.write(chunk)
                done = int(30 * dl / int(total_length))
                sys.stdout.write("\r[%s%s] %s Mbps" % ('=' * done, ' ' * (30-done), dl//(time.clock() - start) / 100000))

    print( f"\nsize = (time.clock() - start):.2f seconds")

用法示例:

speed_test()
speed_test(10)
speed_test(50, "ipv6")
speed_test(1024, port=8080)

输出样本:

[==============================] 61.34037 Mbps
100MB = 17.10 seconds

可用选项:

大小:5, 10, 20, 50, 100, 200, 512, 1024

ipv:ipv4, ipv6

端口:80, 81, 8080

【讨论】:

函数time.clock() 已被删除,自 Python 3.3 起已被弃用:在上述解决方案代码中使用 time.perf_counter()

以上是关于配置cpmv命令显示进度和速度的主要内容,如果未能解决你的问题,请参考以下文章

第七课 环境变量PATH,cpmv及查看文档cat/more/less/head/tail命令

前端上传文件实时显示进度条和上传速度的工作原理是怎样的?

多线程下载 显示进度 速度(转)

Python获取下载速度并显示进度条

4-10 Linux 中的文件同步传输 --- rsync

Linux cpmv 移动复制文件忽略不存在的文件提示