使用cp复制文件时如何显示传输进度和速度?

否则,是否有任何替代命令行实用程序可以实现此目的?

虽然cp没有这个function,你可以使用pv来做到这一点:

 pv my_big_file > backup/my_big_file 

注意:此方法将丢失文件的权限和所有权。 以这种方式复制的文件将具有与您自己创建的文件相同的权限,并且属于您。

在此示例中, pv基本上只是将文件输出到stdout *,您可以使用>运算符将其重定向到文件。 同时,它会在您执行此操作时将有关进度的信息打印到终端。

这就是它的样子:

 stefano@ubuntu:~/Data$ pv my_big_file > backup/my_big_file 138MB 0:00:01 [73.3MB/s] [=================================>] 100% 

你可能需要 在您的系统上安装pv (或者,键入sudo apt-get install pv )。


*: 技术位

在类似unix的系统中有三个重要的数据流:stdout(标准输出),stderr(标准错误)和stdin(标准输入)。 可以这么说,每个节目都有三个。 >重定向操作符将程序输出重定向到文件。 如上所述,如果没有参数, >将程序的标准输出重定向到文件。 cp基本上没什么比这更好的了

 cat source > destination 

cat只读取文件并将其打印到stdout)。 pv就像cat一样,但是如果你将它的输出流重定向到其他地方,它会将进度信息打印到stdout。

看看man pv ,了解更多相关信息。


另一种选择,如 替代文字 DoR建议在这个答案中使用rsync代替:

 $ rsync -ah --progress source-file destination-file sending incremental file list source-file 621.22M 57% 283.86MB/s 0:00:01 

这将在显示进度时保留文件权限/所有权。

没有。 请看这里为什么。 虽然它比你需要的更多,但rsync有一个带--progress参数。 -a将保留权限等,-h将是人类可读的。

 rsync -ah --progress source destination 

输出看起来像这样:

 Pictures/1.jpg 2.13M 100% 2.28MB/s 0:00:00 (xfr#5898, to-chk=1/5905) Pictures/2.jpg 1.68M 100% 1.76MB/s 0:00:00 (xfr#5899, to-chk=0/5905) 

如果你想查看文件是否正确传输,你可以使用gcpgcp就像cp,但默认情况下会为你提供一个进度条,以便你可以看到正在复制的内容。 正如该程序的wiki说明 , gcp有几个有用的function,如

  • 转移进展指示
  • 连续复制错误(跳到下一个文件)
  • 复制状态日志记录:gcp记录其所有操作,以便可以知道哪些文件已成功复制
  • 命名mangling以处理目标文件系统限制(例如在FAT上删除不兼容的字符“*”或“?”)

但是,即使使用该工具时进度条已达到100%,您必须等到终端提示再次出现,然后才能安全地移除介质,以便确保传输过程已成功完成。

gcp用于复制文件,并具有--preserve等选项,以便可以保留各种属性和权限,并且 – --recursive以便可以复制整个目录。 有关其选项的更多信息可以通过输入man gcp或在线访问Ubuntu联机帮助页找到 。 本网站还提供了一个教程。

从存储库安装gcp

 sudo apt-get install gcp 

注意 :在Ubuntu 12.10中,新的automount点是,例如, /media/user/usbdisk

您可以输入以将文件复制到媒体

 gcp /home/mike/file.mp4 /media/usb 

并使用。将文件夹复制到您的媒体

 gcp -rv ~/Podcasts /media/Mik2 

使用进度条从gcp输出示例:

 gcp ~/Videos_incIplayer/mars.flv /media/Mik2 Copying 168.57 MiB 100% |########################################################| 7.98 M/s Time: 00:00:22 

您当然可以指定要复制到磁盘的多个文件或文件夹, man gcp还有很多其他选项。

为了这个目的,我开始使用cURL。 手册页列出了支持的“FILE”协议,因此只需像URL中的任何其他协议一样使用它:

 curl -o destination FILE://source 

速度,进度,剩余时间等 – 全部采用熟悉的格式。

虽然它不显示速度,但在复制多个文件时, cp命令的-v选项将为您提供进度信息。 例如

 cp -rv old-directory new-directory 

内核知道大部分数据,例如速度,通常也是百分比。 现代内核通过它们的/ proc文件系统公开它。

来自https://github.com/jnweiger/showspeed的 showpeed使用该信息。 它可以附加到已经运行的程序并定期更新,如下所示:

 $ dd if=bigfile of=/tmp/otherbigfile & $ showspeed dd dd looks like a process name. pid=4417 matches av0=dd. p/4417/fd/0r /home/jw/bigfile 113MB/s (12%, 2.3GB) 9m:35 p/4417/fd/1w /tmp/otherbigfile 182MB/s (2.6GB) p/4417/fd/0r /home/jw/bigfile 285MB/s (15%, 3.0GB) 8m:08 p/4417/fd/0r /home/jw/bigfile 115MB/s (16%, 3.2GB) 8m:01 p/4417/fd/0r /home/jw/bigfile 107MB/s (17%, 3.4GB) 7m:39 p/4417/fd/1w /tmp/otherbigfile 104MB/s (3.5GB) p/4417/fd/0r /home/jw/bigfile 139MB/s (19%, 3.7GB) 7m:37 p/4417/fd/0r /home/jw/bigfile 116MB/s (20%, 3.9GB) 7m:18 p/4417/fd/1w /tmp/otherbigfile 67MB/s (4.0GB) p/4417/fd/1w /tmp/otherbigfile 100MB/s (4.1GB) ... 

虽然pv可以处理本地cp任务,但使用带有pv dd可以处理本地( cp )和远程( scp )任务。

 dd if=path/to/source.mkv | pv | dd of=path/to/dest.mkv 

请确保通过touch path/to/dest.mkv退出touch path/to/dest.mkv

这可以显示进度,但如果您想要百分比信息,

 dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv 

将上面的100M替换为源文件的实际大小。

这是远程部件

虽然scp很难显示当前的进展,但使用ddpv是一块蛋糕。

 ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv 

存储库中有一个名为progress的工具,它可以检查各种不同的命令并显示它们的进度信息。

使用该命令安装它

 sudo apt-get install progress 

这个工具可以这样使用:

 cp bigfile newfile & progress -mp $! 

输出:

 [11471] cp /media/Backup/Downloads/FILENAME.file 29.9% (24.2 MiB / 16 MiB) 

有一个名为cv的新工具可以找到与正在运行的命令相关的任何描述符并显示进度和速度: https : //github.com/Xfennec/cv

 cv -w 

输出所有正在运行的cp,mv等操作的统计数据

正如许多人所说,cp不包括此function。

只是扔掉我的0.02美元,我通常用琐碎的复制情况做的(即没有-R ):

  1. 看看文件的大小和记忆

  2. 开始复制

  3. 打开另一个终端

  4. 在目标所在的watch ls -lh DIR上运行watch ls -lh DIR

这可以让我更新目标文件大小,而且麻烦很少。

作为不太重要的情况的替代方案,例如递归复制目录,您可以使用watch du -hs DIR来查看DIR大小的摘要。 但是du可能需要很长时间才能计算,甚至可能会减慢复制速度,因此您可能希望使用-n INTERVAL参数进行监视,以便权衡取舍。

更新:如果您使用带有watch du的命令的通配符,例如watch du -hs backup/* ,请不要忘记引用:

 watch "du -hs backup/*" 

否则,当启动监视时,通配符只会扩展一次 ,因此du不会查看新文件/子目录。

dd status=progress

在GNU Coreutils 8.24+(Ubuntu 16.04)中添加了选项:

 dd if=src of=dst status=progress 

终端显示一行类型:

 462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s 

另请参阅: 如何监控dd的进度?

根据你想做的事情,Midnight Commander( mc )可能就是答案。 我很惊讶它还没有被提及。

pvrsync这样的工具可以很好地显示一个巨大文件的传输进度,但是当涉及复制整个目录/树时, mc计算大小,然后非常好地显示进度。 此外,它在大多数系统上都是开箱即用的。

使用shell脚本:

 #!/bin/sh cp_p() { strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \ | awk '{ count += $NF if (count % 10 == 0) { percent = count / total_size * 100 printf "%3d%% [", percent for (i=0;i<=percent;i++) printf "=" printf ">" for (i=percent;i<100;i++) printf " " printf "]\r" } } END { print "" }' total_size=$(stat -c '%s' "${1}") count=0 } 

这看起来像:

 % cp_p /home/echox/foo.dat /home/echox/bar.dat 66% [===============================> ] 

资源

如果你有rsync 3.1或更高版本( rsync --version ),你可以在保留权限和所有权的同时复制(cp -Rpn),递归目录,“no clobber”,并显示整体进度(而不仅仅是按文件进度),复制率和(非常粗略)估计剩余时间:

 sudo rsync -a --info=progress2 --no-ir /source /destination 

请注意,仅在处理您不拥有的目录/文件时才需要sudo。 此外,如果没有--no-ir ,百分比可能会在复制期间的某个时刻重置为较低的数字。 也许更高版本的rsync将默认为no-ir,其中info = progress2,但它不在当前版本的3.1.2中。

我发现当复制到已经包含文件的目录时,剩余的百分比和剩余时间被大大高估了(例如,当您通常使用cp -n“no clobber”时)。

保留属性的另一个选项可能是(如果source是将在destination创建的文件夹)

 tar -c source | pv -e -t -p -r | tar -C destination -x 

希望它对某人有用。 要估计传输时间,可以通过事先做do -s source并将其作为-s 参数传递给pv

您可以复制使用任何程序。 同时,您可以启动sudo iotop并查看实际磁盘读/写速度但没有进展。

检查以下git存储库中progress_bar的源代码

https://github.com/Kiran-Bose/supreme

另外尝试自定义bash脚本包至上

下载deb文件并安装在基于debian的发行版中或下载源文件,修改和使用其他发行版

function概述

(1)打开应用程序—- Firefox —-计算器—-设置

(2)管理文件—-搜索—-导航—-快速访问

  |----Select File(s) |----Inverse Selection |----Make directory |----Make file |----Open |----Copy |----Move |----Delete |----Rename |----Send to Device |----Properties 

(3)管理电话—-从手机移动/复制—-移动/复制到手机—-同步文件夹

(4)管理USB —-从USB移动/复制—-移动/复制到USB