问题描述
使用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
)。
*:技术位
unix-like系统中有三个重要的数据流:stdout(标准输出),stderr(标准错误)和stdin(标准输入)。可以这么说,每个节目都有三个。 pipe-operator将程序输出重定向到另一个程序输入。 >
操作员将程序标准输出重定向到文件。 cp
基本上没有什么比发烧友更好
cat source > destination
(其中cat
只是读取一个文件并将其打印到stdout中)。 pv
就像 cat 一样,但是如果将其输出流重定向到其他地方,它会将进度信息打印到标准输出。
查看man pv
以了解更多信息。
DoR在this answer中建议的另一种选择是使用rsync代替:
rsync -ah --progress source-file destination
这将在显示进度的同时保留文件权限/所有权。
次佳解决办法
没有。至于为什么,请参阅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 notes,gcp
有几个有用的功能,如
- 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
任务,但使用dd
和pv
可以处理本地(cp
)和远程(scp
)任务。
dd if=path/to/source.mkv | pv | dd of=path/to/dest.mkv
请确保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
几乎无法显示当前的进展,但将dd
与pv
结合使用是一件小事。
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
):
-
看看这个文件有多大并且记住
-
开始复制
-
打开另一个终端
-
在目标所在的目录上运行
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不会查看新文件/子目录。