当前位置: 首页>>技术问答>>正文


‘cp’的进步和速度?

, ,

问题描述

使用cp复制文件时,是否可以显示传输的进度和速度?否则,是否有任何可以实现此目的的替代命令行工具?

最佳解决办法

虽然cp尚未获得此功能,但您可以使用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)。

command-line,coreutils,ubuntu


*:技术位

unix-like系统中有三个重要的数据流:stdout(标准输出),stderr(标准错误)和stdin(标准输入)。可以这么说,每个节目都有三个。 pipe-operator将程序输出重定向到另一个程序输入。 >操作员将程序标准输出重定向到文件。 cp基本上没有什么比发烧友更好

cat source > destination

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

查看man pv以了解更多信息。


DoR在this answer中建议的另一种选择是使用rsync代替:

command-line,coreutils,ubuntu

rsync -ah --progress source-file destination

alt text

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

次佳解决办法

没有。至于为什么,请参阅here。尽管它的功能比您需要的多,但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)

第三种解决办法

如果你想看看你的文件是否正确传输,你可以使用gcp,而gcp就像cp一样,但是默认情况下会给你一个进度条,这样你就可以看到正在被复制的内容。作为该程序的wiki notesgcp有几个有用的功能,如

  • transfer progression indication
  • continuous copying on error (skip to next file)
  • copy status logging: gcp logs all its actions so that it is possible to know which files have been successfully copied
  • name mangling to handle target filesystem limitations (for example deletion of incompatible characters “*” or “?” on FAT)

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

gcp用于复制文件并具有诸如--preserve之类的选项,以便可以保留各种属性和权限,并且可以复制--recursive以便复制整个目录。通过输入man gcp或进入Ubuntu manpages online可以找到更多关于其选项的信息。教程也可用on this site

用存储库从存储库安装gcp

sudo apt-get install gcp

(注意:在Ubuntu 12.10中,新的自动挂载点例如是/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

速度,进度,剩余时间等等 – 都以熟悉的格式。

第五种办法

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

cp -rv old-directory new-directory

第六种办法

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

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

$ 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任务,但使用ddpv可以处理本地(cp)和远程(scp)任务。

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

请确保path/to/dest.mkvtouch 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

第八种办法

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

cv -w

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

第九种办法

存储库中有一个名为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)

第十种办法

正如很多人所说,cp不包括这个功能。

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

  1. 看看这个文件有多大并且记住

  2. 开始复制

  3. 打开另一个终端

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

这可以让我更新目标文件的大小,并且相当麻烦。

作为较不重要情况的替代方法,例如递归复制目录,您可以使用watch du -hs DIR来查看DIR大小的摘要。但是du可能需要很长时间来计算,甚至可能会减慢复制速度,所以您可能需要使用-n INTERVAL参数来观察,以便trade-off可以接受。

更新:如果您使用wild-cards和watch du一起使用的命令,例如watch du -hs backup/*,别忘了引用:

watch "du -hs backup/*"

否则wild-cards将只扩展一次,因此 watch 启动时,du不会查看新文件/子目录。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/126.html,未经允许,请勿转载。