cp
复制。我想知道是否有任何参数显示复制的百分比以及传输速度。 #1 楼
rsync
有一个名为progress2
的标志,它显示了整体百分比:rsync --info=progress2 source dest
正如@AdrianTNT在注释中指出的那样,至少从
rsync
版本3.0.9起,该标志现在只是--progress
,因此命令可能是简化为:rsync --progress source dest
评论
--info = progress2仍未放入默认存储库,现在是2015年。似乎是个好主意。
–Lonniebiz
2015年4月1日在8:27
--info = progress2最终包含在版本3.1.0协议版本31中。也许您可以编辑答案yzT。
– Sopalajo de Arrierez
2015年5月9日在21:14
我从--info = progress2注意到rsync快速发展! 200 MB / s,而Windows的速度不超过90 MB / s!
– ReneFroger
16年6月28日在18:12
@ReneFroger尽管这可能是实际速度(取决于设备),但在Linux中通常该速度确实是错误的,并且复制完成后,系统仍在写入设备,与Windows中可以弹出设备不同几乎立即。如果复制大文件,您会注意到它以如此快的速度启动,但随后下降到标准速度。
–Ay0
16-6-29在5:46
它对我来说只是进步。 rsync版本3.0.9
– adrianTNT
17 Mar 8 '17 at 17:11
#2 楼
如果您允许使用除cp
之外的其他工具,那肯定可以。对于单个文件,可以使用pv
。这是一个提供良好统计信息的小型工具。pv inputfile > outputfile
如果您有多个文件或目录,则可以使用tar:
tar c sourceDirectory | pv | tar x -C destinationDirectory
您可以将其包装在shell函数中。键入的次数更少,并且语义接近
cp
。这是一个非常简单(且并非防错!)的函数:您必须使用以下变体:cpstat () {
tar c "" | pv | tar x -C ""
}
您这样称呼
cpstat () {
tar cf - "" | pv | (cd "";tar xf -)
}
您可以增强
另一种解决方案(如评论中提到的frostschutz)是将rsync与
tar
选项一起使用:cpstat sourceDirectory destinationDirectory
评论
这将为您提供传输速度,但不会提高ETA,因为pv不知道将通过管道传输多少数据。您可以使用-s进行指定。例如。首先执行du -sh sourceDirectory以获得一个(大致的)想法,然后将其传递给pv,如下所示:pv -s 100m。
– Jan Fabry
2014年5月11日15:25
--info = progress2为您提供目录级别的进度统计信息。
– AlexLordThorsen
2014年12月5日23:40
vbuf(debian,ubuntu)比pv快很多,可能是因为它的虚拟环形缓冲区
– Skaperen
2015年10月4日在10:56
@Skaperen我不认识vbuf。但是目前看来它在Debian中不稳定,因此通常在通常运行Debian稳定版的服务器上不可用。
–马可
2015年10月4日在18:35
您想要的速度,复制数量,复制百分比,时间和ETA是:cat $ 1 | pv -a -r -b -p -e -s $(stat --printf =“%s” $ 1)> $ 2请注意,如果磁盘速度非常快,pv会降低速度。
– sudo
18-4-25在18:51
#3 楼
rsync
最能在复制过程中显示进度。例如:
rsync -avh --progress sourceDirectory destinationDirectory
#4 楼
是否可以看到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 :(使用补丁
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
和coreutils-8.21/src/
复制到/usr/local/bin
: br /> cp src/cp /usr/local/bin/cp
cp src/mv /usr/local/bin/mv
或使用您的文件管理器作为根复制它
在
~/.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
评论
看起来像是cp修补程序的真实来源:web.archive.org/web/20131115171331/http://beatex.org/web/…
– Kaushal Modi
17年5月27日在15:45
要修复“请将gnulib fseeko.c移植到您的平台上!”错误,请参阅github.com/fede2cr/slackware_riscv/issues/…
– GAD3R
4月4日20:08
#5 楼
如其他答案所述,cp不提供该功能。但是,进度(以前称为cv)是一个很小的工具,对提供此缺少的功能非常有帮助。该工具可以描述为Tiny Dirty Linux Only * C命令,看起来用于当前在您的系统上运行的coreutils基本命令(cp,mv,dd,tar,gzip / gunzip,cat等),并显示复制数据的百分比。
I'在过去的几个月中一直在使用它,而且效果稳定。
评论
似乎不适用于所有文件系统(例如cifs),但+1,却不知道这种疯狂的声音退出
–akostadinov
15年3月8日在17:23
请注意,该项目现在称为“ progress-Coreutils Progress Viewer(以前称为cv)”。
–chappjc
2015年10月2日在17:34
这个进度工具似乎还很初级。我只是尝试它监视大型cp的进度-一项复制许多文件和目录的工作(递归)。它似乎只能显示当前正在复制文件的进度,而不能显示整个cp作业。
–单模成型
8月19日5:25
#6 楼
注意此帖子有些旧。但是,当我为手头的问题提出解决方案时,我想我应该发布解决方案。方案:我们有一个非常大的目录结构要复制,因此我们发出命令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 }' | 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时间单位,速度应微不足道才能计算和显示。
评论
实际上,这对于我的用例来说是完美的,因此感谢您发布它!我想知道复制包含数千个文件的巨大目录的进度,而不仅仅是一个文件,因此其他解决方案并没有真正帮助我。
–易卜拉欣
2015年4月10日在18:09
这很棒,尤其是在某些情况下(例如我现在正在经历的情况):远程启动一个巨大的mv-job来将TB的备份从一个存储池移动到另一个存储池,而无需事先考虑其含义。现在,我可以轻松地为该流程提供背景并进行查看。太棒了!
–赖利
17年1月27日在23:13
#7 楼
为了改善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 - )
;}
#8 楼
在标准版本的cp
中不存在。您可以在等待
cp
完成时将cp设为背景并列出大小。 我使用此perl监视单个文件的增长,但它在cp外部运行(或我在做什么)
#9 楼
我发现它可以使用,效果很好:sudo watch lsof -p`pgrep -x cp`
来自Mike关于如何检查cp的运行进度的问题的评论
#10 楼
即使rsync
会为您提供一些进度统计信息,但如果您想要进度条,也应该使用pv
。您可以使用
cpv
,它是pv
的包装器,语法更简单,与cp
的语法更相似您可以用来递归复制目录您可以在这里获取它
#11 楼
dd status=progress
GNU Coreutils 8.24+(Ubuntu 16.04)中添加的选项:
dd if=src of=dst status=progress
Stdout是定期更新的行,例如:
462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
另请参阅:如何监视dd的进度? |询问Ubuntu
#12 楼
另一个简单的解决方案是仅监视输出文件夹,如下所示:Linux / Cygwin:
watch -n 10 --differences du -sk --apparent-size <WATCHED_FOLDER>
FreeBSD:
gnu-watch -n 10 --differences du -sk <WATCHED_FOLDER>
这个方便的实用程序将运行
du
并突出显示它们之间的差异。 另一个可能的解决方案是编写一个简单的循环脚本,调用
du
并大致估算出吞吐量。#13 楼
使用mc
这样的工具(午夜指挥官)可以作为其他答案的不错选择。这是一个简单的文件管理器,向您显示复制/移动进度。
#14 楼
我只是有一种情况,由于接收文件系统中的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
#15 楼
VCP –在curses界面中复制文件(在Linux中显示进度栏)。
描述:vcp在curses界面中复制文件和目录,
仅提供文本输出。
它的选项和输出与BSD的cp类似,但增加了一些新功能。
它提供以下信息:
复制并保留复制的文件
写入的数据和总数据大小
每秒写入的数据
两个状态栏,一个显示当前文件状态,另一个显示总状态
(除了一个文件,两个都显示当前状态) )和百分比
将输出发送到控制台时:
状态栏
复制大小和速度
>
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
#16 楼
使用rsync。但是,rsync --info=progress2 source dest
产生错误skipping directory source
。您必须添加-r
或-a
选项或类似选项才能解决此问题。我建议使用-a
并添加--stats
以在最后显示一个不错的输出摘要。最后,在前面添加time
以查看整个过程花费了多长时间。 因此,请改为执行以下操作:
time rsync -a --info=progress2 --stats source destination
使用此命令,我只用了大约2.5分钟就在一个快速的SSD驱动器中复制了一个42GB的目录!
这是输出。请注意,此运行的“实际”时间为2.798秒。那是因为我忘了在第一次运行时实际使用了副本的
time
,所以当源和目标中的所有内容都已经相同时,这就是输出的样子。$ time rsync -a --info=progress2 --stats mydir mydir_copy
0 0% 0.00kB/s 0:00:00 (xfr#0, to-chk=0/289187)
Number of files: 289,187 (reg: 266,595, dir: 22,580, link: 12)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 0
Total file size: 48,621,942,935 bytes
Total transferred file size: 0 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 2,096,688
File list generation time: 0.017 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 11,036,784
Total bytes received: 24,420
sent 11,036,784 bytes received 24,420 bytes 4,424,481.60 bytes/sec
total size is 48,621,942,935 speedup is 4,395.72
real 0m2.798s
user 0m1.115s
sys 0m1.935s
更新:
这里是48GB文件夹的完整副本的外观。花了3分钟的13.408秒!
$ time rsync -a --info=progress2 --stats mydir mydir_bak
48,621,942,066 99% 239.88MB/s 0:03:13 (xfr#266595, to-chk=0/289188)
Number of files: 289,188 (reg: 266,595, dir: 22,581, link: 12)
Number of created files: 289,188 (reg: 266,595, dir: 22,581, link: 12)
Number of deleted files: 0
Number of regular files transferred: 266,595
Total file size: 48,621,942,935 bytes
Total transferred file size: 48,621,942,066 bytes
Literal data: 48,621,942,066 bytes
Matched data: 0 bytes
File list size: 12,515,323
File list generation time: 0.034 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 48,656,219,349
Total bytes received: 5,209,801
sent 48,656,219,349 bytes received 5,209,801 bytes 251,480,254.01 bytes/sec
total size is 48,621,942,935 speedup is 1.00
real 3m13.408s
user 2m40.937s
sys 1m0.627s
相关:
详细的描述和许多方法的示例使用rsync,包括镜像(删除不只是添加文件):https://superuser.com/questions/1271882/convert-ntfs-partition-to-ext4-how-to-copy-the-data/1464264#1464264
#17 楼
使用BSDcp
,如果您使用ctrl + t,则必须更新百分比,如果必须使用cp
评论
不幸的是,这仅适用于BSD cp,不适用于GNU one。
–雅库布·金德拉(Jakub Jindra)
8月7日5:46
评论
Midnight Commander也可以很好地工作,并且具有带进度条的漂亮的基于文本的UI,但可能未安装。在命令提示符下尝试mc。另外,显然不是cp。结合使用rsync和--progress可以让我弄清楚发生了什么。达到100%时卡住,然后持续几分钟。我认为鹦鹉螺正在发生的事情是一样的。无论如何,这已经是另一个问题了,所以对此问题的最佳答案是rsync --progress,它显示大小,%,速度和经过的时间。
我对rsync --progress有疑问。假设我的目录A包含文件a和b,空目录B,当我将A复制到B时,它显示每个文件的进度,即a的进度和b的进度。有什么方法可以显示整体进度吗?
rsync的一个问题是它的运行速度比纯副本慢。在我的大型服务器上,两者的差异分别为60MB / s和300MB / s。
@pdwalker甚至带有-W选项?在我所有的主机上,rsync几乎与cp一样快...因此,我经常使用rsync而不是cp。