是否有可能看到cp速度和复制的百分比?


251

使用nautilus复制大文件时遇到问题(卡住了)。我需要使用复制cp。我想知道是否有任何参数显示复制的百分比以及传输速度。


39
您可以使用rsync代替cp。它有一个--progress选择。
frostschutz

2
Midnight Commander效果也不错,并且具有带进度条的漂亮的基于文本的UI,但可能未安装。尝试mc在命令提示符下。另外,显然不是cp
CVn

3
使用rsyncwith --progress只是让我弄清楚发生了什么。当达到100%时卡住,然后持续几分钟。我认为鹦鹉螺也一样。无论如何,这已经是另一个问题了,因此,此问题的最佳答案是rsync --progress,它显示了大小,%,速度和经过时间。
yzT 2013年

2
rsync的一个问题是它的运行速度比纯副本慢。在我的大型服务器上,两者的差异分别为60MB / s和300MB / s。
pdwalker 2014年

1
@pdwalker甚至可以-W选择吗?我所有主机rsync上的速度几乎cp... ...如此之快,我经常用它rsync代替cp
Skaperen 2015年

Answers:


193

rsync有一个标记progress2,显示总百分比:

rsync --info=progress2 source dest

5
--info = progress2仍未放入默认存储库,现在是2015年。似乎是个好主意。
Lonniebiz

1
--info=progress2终于列入version 3.1.0 protocol version 31。yzT,也许您可​​以编辑答案。
Sopalajo de Arrierez,2015年

1
我从中注意到--info=progress2rsync的速度很快!200 MB / s,而Windows的速度不超过90 MB / s!
ReneFroger

1
@ReneFroger尽管这可能是实际速度(取决于设备),但在Linux中,通常速度确实是错误的,并且复制完成后,系统仍在写入设备,与Windows中可以弹出设备不同几乎立即。如果复制大文件,您会注意到它以如此快的速度启动,但随后下降到标准速度。
yzT '16

7
它对我起作用--progress。rsync版本3.0.9
adrianTNT

103

如果您允许使用其他工具,cp那肯定可以。对于单个文件,您可以使用pv。这是一个提供良好统计信息的小工具。

pv inputfile > outputfile

如果您有多个文件或目录,则可以使用tar:

tar c sourceDirectory | pv | tar x -C destinationDirectory

您可以将其包装在shell函数中。键入的次数更少,语义也接近cp。这是一个非常简单的(并且不是防错的!)功能:

cpstat () {
  tar c "$1" | pv | tar x -C "$2"
}

请注意,某些版本的tar不支持上述语法(例如Solaris tar),您必须使用以下变体:

cpstat () {
  tar cf - "$1" | pv | (cd "$2";tar xf -)
}

你这样称呼它

cpstat sourceDirectory destinationDirectory

您可以进一步增强它,以便pv估计剩余时间。

另一个解决方案(如rosschutz在评论中提到的)是将rsync与以下--progress选项一起使用:

rsync --progress -a sourceDirectory destinationDirectory

1
cpstat进入pastebin =)
Matt

7
这将为您提供传输速度,而不是ETA,因为pv它不知道将通过管道传输多少数据。您可以使用指定-s。例如,首先du -sh sourceDirectory要获得一个(大致)想法,然后将其传递给pv,如下所示:pv -s 100m
2014年

1
--info = progress2为您提供目录级别的进度统计信息。
AlexLordThorsen 2014年

vbuf(debian,ubuntu)的速度比快很多pv,这可能是由于其虚拟环形缓冲区
Skaperen 2015年

@Skaperen我不知道vbuf。但是目前看来它在Debian中是不稳定的,因此通常在通常运行Debian稳定版的服务器上不可用。
Marco Marco

58

rsync 在复制进度中最能显示进度。

例如:

rsync -avh --progress sourceDirectory destinationDirectory

27

如其他答案所述,cp不提供该功能。但是,进度(以前称为cv)是一个很小的工具,在提供此缺失功能方面非常有帮助。

此工具可以描述为Tiny Dirty Linux Only * C命令,用于查找当前在系统上运行的coreutils基本命令(cp,mv,dd,tar,gzip / gunzip,cat等),并显示已复制百分比数据。

在过去的几个月中,我一直在使用它,它的性能很稳定。


似乎无法使用所有文件系统(例如cif),但+1却不知道这种疯狂的ting出口
akostadinov

1
请注意,该项目现在称为“ progress-Coreutils Progress Viewer(以前称为cv)”。
chappjc 2015年

17

是否有可能看到cp速度和复制的百分比?

是的,可以cp在终端上显示命令的进度。


方法1 :(使用progress

打开一个新的终端并键入progress它将显示cp命令和其他命令的进度,例如:

cp, mv, dd, tar, cat, rsync, grep, fgrep, egrep, cut, sort, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, adb, gzip, gunzip, bzip2, bunzip2, xz, unxz, lzma, unlzma, 7z, zcat, bzcat, lzcat, split, gpg

如果您没有安装progress,则可以从存储库中安装它,例如,CentOS使用以下命令:yum -y install progress

然后cp,在后台运行命令或cp正常运行后,打开另一个终端,因此只需尝试以下命令:

# progress -m

查看输出:

[30904] cp /home/user/file.mp4
        2.3% (200.9 MiB / 8.4 GiB) 3.6 MiB/s remaining 0:38:58

方法2 :(使用patch cp

或下载GNU coreutils并对其进行修补。

cd /tmp
wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz
tar -xvJf coreutils-8.21.tar.xz
cd coreutils-8.21
wget https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch
patch -p1 -i advcpmv-0.5-8.21.patch

跑:

export FORCE_UNSAFE_CONFIGURE=1
./configure
make

复制这两个文件cp,并mv在loacated coreutils-8.21/src//usr/local/bin

cp src/cp /usr/local/bin/cp
cp src/mv /usr/local/bin/mv

或使用您的文件管理器作为root复制它

将以下行添加到您的~/.bashrc

alias cp='cp -gR'
alias mv='mv -g'

注销和登录

进度条可以显示为不带有作者推荐的–g–progress-bar

查看输出:

0 files copied so far...                                              194.4 MiB /   8.4 GiB
[||--------------------------------------------------------------------------------]  2.3 %
Copying at   3.3 MiB/s (about 0h 5m 47s remaining)
/home/user/file.mp4                                                   194.4 MiB / 446.1 MiB
[||||||||||||||||||||||||||||||||||||----------------------------------------------] 43.6 %

来源:linuxhelp


1
这看起来像是cp补丁的真实来源:web.archive.org/web/20131115171331/http
Kaushal Modi,

1
+1有关progress命令的提示
彼得

这是唯一的真实答案
Alessio

14

注意此帖子有些旧。但是,当我为眼前的问题提出解决方案时,我想我应该发布解决方案。

场景:我们有一个非常大的目录结构要复制,因此我们在一个终端窗口中发出命令cp -R sourcedir destdir。

打开另一个终端窗口或将进程推到后台(Ctrl+Z,bg<CR>),然后让我们以贫民窟的方式制作一个进度指示器:

我们首先获得要复制的目录结构的总大小,您可以使用以下方法进行操作:

du -sh /path/sourcedirectory/

将结果转换为千兆字节(G),然后将n替换为您在变量sourcesize中获得的结果。插入sourcesize和destdir(目标目录)后,运行以下命令。

while true; do sourcesize=n destdir=/path/destinationdirectory/ copyprogress="$(export | du -sh $destdir | awk '{print $1}' | sed 's/[^0-9.]*//g' )" ; echo "scale=3 ; $copyprogress / $sourcesize * 100" | bc | xargs echo -n ; echo % completed ; sleep 10 ; done

这将每隔10秒打印一次进度,并显示以下消息:

0.100% completed
0.200% completed
0.300% completed 
... etc

我知道该解决方案无法解决复制速度问题,但是可以通过扩展上述命令来添加它,并使其成为bash脚本,以便于阅读。例如,通过检查复制了多少数据。在时间单位n中,速度的计算和显示应微不足道。


实际上,这对于我的用例来说是完美的,因此感谢您发布它!我想知道复制包含数千个文件的巨大目录的进度,而不仅仅是一个文件,因此其他解决方案并没有真正帮助我。
Ibrahim

这非常好,尤其是在某些情况下(例如我现在正在经历的情况):远程启动了一个大型mv-job,以将TB的备份从一个存储池移动到另一个存储池,而无需事先考虑其含义。现在,我可以轻松地为该流程提供背景并进行查看。太棒了!
莱利

8

为了改善Marco的答案,今天我编写了此版本的cpstat,因此您可以复制许多目录并将最后一个参数用作目标路径。请注意,如果您使用相对深路径作为源,则可以借助tar,自动创建相同的从属目录树。

function cpstat () {

    tar -cf - "${@: 1: $#-1}" |
    pv -s "$( du -cs -BK --apparent-size "${@: 1: $#-1}" |
              tail -n 1 |
              cut -d "$(echo -e "\t")" -f 1)" |
    ( cd "${@: $#}"; tar -xf - )

;}



5

即使rsync会为您提供一些进度统计信息,但是如果您想要进度条,也应该使用pv

您可以使用cpv,包装器pv提供了更简单的语法,类似于cp用于递归复制目录的包装器

在此处输入图片说明

你可以在这里得到


+1提示pv。好发现!
彼得

4

使用mc(午夜指挥官)之类的工具可能是其他答案的不错选择。

这是一个简单的文件管理器,向您显示复制/移动进度。



4

另一个简单的解决方案是仅监视输出文件夹,如下所示:

Linux / Cygwin: watch -n 10 --differences du -sk --apparent-size <WATCHED_FOLDER>

FreeBSD: gnu-watch -n 10 --differences du -sk <WATCHED_FOLDER>

该实用程序将运行du并突出显示差异。

另一种可能的解决方案是编写一个简单的脚本,该脚本循环,调用du并吐出吞吐量的粗略估计。


3

该工具是Linux实用程序命令,用于查找当前在系统上运行的coreutils基本命令(cp,mv,dd,tar,gzip / gunzip,cat等),并显示复制数据的百分比:

https://github.com/Xfennec/cv


1
@AmrMostafa已在14年11月提出建议。
2015年

2

我只是有一种情况,由于接收文件系统中的FUSE错误,cp或多或少被阻塞了。

如果您不能只从cp切换(即因为--sparse = always)并想要实际上可靠的进度,请通过/ proc。

Every 2.0s: cat /proc/20977/io                                                      Thu Sep 28 04:08:57 2017

rchar: 268573800
wchar: 268500992
syscr: 4112
syscw: 4097
read_bytes: 268697600
write_bytes: 0
cancelled_write_bytes: 0

0

VCP –在curses界面中复制文件(在Linux中显示进度栏)。

描述: vcp在curses界面中复制文件和目录,仅提供文本输出。它的选项和输出与BSD的cp类似,但增加了一些新功能。

它提供以下信息:

  • 复制文件并保留复制
  • 写入的数据和总数据大小
  • 每秒写入一次数据
  • 两个状态栏,一个显示当前文件状态,另一个显示总状态(除1个文件外,均显示当前状态)和百分比

当输出发送到控制台时:

  • 状态栏
  • 复制的大小和速度

VCP手册页:https : //linux.die.net/man/1/vcp

从以下位置下载vcp-2.2.tar.gz:

http://distfiles.gentoo.org/distfiles/vcp-2.2.tar.gz

依赖项:curses.h(libncurses-dev)。

在Ubuntu上,安装:

sudo apt-get install libncurses-dev

要么

sudo apt-get install libncurses5-dev

安装vcp:

make && make install

手册:

man vcp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.