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

评论

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。

#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下的两个文件mvcoreutils-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 楼

使用BSD cp,如果您使用ctrl + t,则必须更新百分比,如果必须使用cp

评论


不幸的是,这仅适用于BSD cp,不适用于GNU one。

–雅库布·金德拉(Jakub Jindra)
8月7日5:46