否则,是否有任何其他命令行实用程序可以实现此目的?

评论

重复的问题:unix.stackexchange.com/questions/65077/…

如果您已经启动了cp命令,并且不想立即停止它,则可以观看目标的大小,如下所示:askubuntu.com/a/1275972/327339(观看“ du -hs”),知道它确实在增长并且副本正在运行。

#1 楼

虽然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中有三个重要的数据流类系统:stdout(标准输出),stderr(标准错误)和stdin(标准输入)。可以这么说,每个程序都有这三个。 >重定向操作符将程序输出重定向到文件。如上所示,不带参数的>将程序的标准输出重定向到文件。 cp基本上没有什么比

cat source > destination


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

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


,如 DoR在此答案中建议的,另一个选择是改用rsync:

$ rsync -ah --progress source-file destination-file
sending incremental file list
source-file
        621.22M  57%  283.86MB/s    0:00:01


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

评论


它可能有意义,也可能没有意义(取决于情况),但是pv不会像cp一样处理权限...(基于我尝试过的一项快速测试:pv并未复制执行位。.rsync做到了。

– Peter.O
2010-12-14 15:55

IMO:别名cp =“ rsync -avz” cp已过时。

– Marco Ceppi♦
2010-12-26 1:26

如果您像我一样,而忘记了pv,则可以窥探cp / fd的/ proc / PID和cp / fdinfo的/ proc / PID来了解进度。 (由您来推断速度。)我使用这种技术来观看updatedb。

–Thanatos
2010-12-26 1:30

是的,-z应该只用于网络副本;压缩和解压缩本地副本的数据纯属开销。

–马修·雷德(Matthew Read)
15年6月17日在15:17

@MarcoCeppi,使用rsync复制目录时,请确保不要在源路径中添加尾随/(或者如果例如bash补全会自动将其放在此处,则将其删除)。否则,您将获得与使用cp(或gcp)时不同的结果。

– Piotr Findeisen
16-4-3在19:07



#2 楼

没有。看看这里为什么。尽管功能超出您的需求,但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)


评论


这在当前的Ubuntu(14.10)中效果很好。它还支持-r标志来递归目录。它甚至可以被别名为cp的直接替代品:alias cp =“ rsync -ah --progress”

–rustyx
2014年12月23日下午21:04

我比pv更喜欢这种替代方法,特别是因为rsync是标准安装的一部分

– Joao Costa
17年9月17日在18:31

@bartekbrak感谢您的分享。我目前在运行rsync 3.1.2的自制版本的macOS 10.12.x上使用--progress使我的头旋转spin看着终端上的所有输出显示。因此,那些来自AOL关键字搜索的信息,rsync -ah --info = progress2 [source] [destination]以更明智的方式显示输出,恕我直言。

– ipatch
18年3月1日在19:53

不幸的是,在复制许多小文件时,输出不是很有帮助。

–拉斐尔
18年4月28日在18:29

@Raphael,是的,这就是为什么您应该使用--info = progress2而不是@ipatch在其注释中建议的--progress的原因

–扎卡丽(Zaccharie Ramzi)
19年6月19日在15:15

#3 楼

如果要查看文件传输是否正确,可以使用gcp,而gcp就像cp一样,但默认情况下会显示进度条,以便您查看正在复制的内容。如程序的Wiki所述,gcp具有一些有用的功能,例如



传输进度指示
错误时连续复制(跳至下一个文件)
复制状态日志记录:gcp记录其所有操作,以便可以知道哪些文件已成功复制
名称修改以处理目标文件系统限制(例如,删除FAT上不兼容的字符“ *”或“?”)




但是,即使使用该工具时进度条已达到100%,也必须等到终端提示再次出现后,才能安全删除媒体,以便确保表示传输过程已成功完成。

gcp用于复制文件,并具有诸如--preserve之类的选项,以便可以保留各种属性和权限,并具有--recursive以便可以复制整个目录。输入man gcp或在线访问Ubuntu手册页,可以找到有关其选项的更多信息。该站点上也提供了教程。

使用

sudo apt-get install gcp

从存储库中安装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包含很多其他选项。

评论


通过ssh dbus.exceptions.DBusException遇到了错误:org.freedesktop.DBus.Error.NotSupported:无法在没有$ DISPLAY的情况下自动启动dbus守护程序X11

–msa.im
16 Jan 17 '23:29

如果您在计算机上打开了X11显示屏,则可以在启动gcp之前设置export DISPLAY =:0.0。如果机器没有头,那么您必须将xsession启动到虚拟帧缓冲区之类的东西,那时候您可能应该只寻找另一个程序

–user292067
16-10-9在17:33

gcp相当不错,但是DBUS / X要求很奇怪。我使用ssh转发通过SSH处理了此问题:ssh -X user @ host,这使我可以运行它。

–奥利♦
16-10-21在12:24

#4 楼

我完全不愿意使用cURL来达到这个目的。手册页列出了受支持的“ FILE”协议,因此只需在URL中像使用其他协议一样使用它即可:

curl -o destination FILE://source


速度,进度,剩余时间等-全部采用熟悉的格式。

评论


这在禁止安装新工具且rsync不可用的环境中尤其有用。

–user190264
2013年9月5日上午7:00

太棒了,这一定是一个必不可少的技巧!

–ionreflex
2015年10月20日在18:13

好答案!聪明!

– 9301293
18年1月10日在20:48

据推测,这与pv具有相同的缺点,即不会保存权限。

– Ploni
18年7月9日,0:09

甜!有什么办法可以使目录工作?

–约瑟夫·拉杰夫·莫莎(Joseph Rajeev Motha)
19-2-25的2:21

#5 楼

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

cp -rv old-directory new-directory


评论


进度信息?这只是冗长的输出。要提供进度信息,您至少现在需要复制多少个文件,甚至需要复制哪些文件。

–朱利安·F·韦纳特(Julian F. Weinert)
15年7月3日在20:21

它显示了文件所在的文件,在要求不高的情况下就足够了。

– Gringo Suave
19年4月27日在23:54

#6 楼

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


评论


我认为这是2019年最新的答案。

– mchid
19-10-18于4:00

progress仅对于监视脚本而言,对常规脚本不是有用的:a)它需要全屏tty,并且由于打开终端错误:错误而失败。其他。因此,您无法将进度报告给管道以在CGI环境中显示进度。 b)现代炮弹不能让僵尸存活足够长的时间,从而将PID释放给其他进程。因此,在可能的竞态条件下,进度可能会监视错误的流程(即,进度是通过NFS加载的)。 c)无法监视诸如strace或dtrace以及一些其他脚本可能发生的睡眠之类的事情。

– Tino
20 Dec 15 '14:10

#7 楼

内核知道大多数数据,例如速度,通常还包括百分比。现代内核通过/ proc文件系统公开此信息。https://github.com/jnweiger/showspeed的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)
...


评论


好一个。但是如何计算出百分比呢?我猜只是在文件以只读方式打开的情况下?在分散访问的情况下,它可能不起作用。

– j_kubik
2014年12月22日在17:29

在这种情况下,您还可以使用另一个终端运行pkill -USR1 dd以使dd显示其状态,另一种选择是watch -n 1 pkill -USR1 dd以使其定期(每秒)显示其进度。

–亚伦
15年3月16日在9:23

对。许多工具都有内置的方式来报告一段时间内的统计信息。 dd也不例外。现代实现具有status = progess选项。 Showspeed是一种经典的Unix风格的“一种工具,一种目的”解决方案-就像光伏一样。但是它有不同的用例:想像一下通过ghostscript抽取文件的杯子,或者您想知道正在进行的cp或tar的ETA。几个小时后,它可能已经完成了95%,您可能不想仅添加pv就重新启动它。分散的访问无法正常进行。 Showspeed仅样本寻找位置。

–于尔根·魏格特(JürgenWeigert)
18年4月30日在19:22

#8 楼

虽然pv可以处理本地cp任务,但是将ddpv一起使用可以处理本地(cp)和远程(scp)任务。
dd if=path/to/source.mkv | pv | dd of=path/to/dest.mkv

请确保path/to/dest.mkv退出touch path/to/dest.mkv
这可以显示进度,但是如果需要百分比信息,
用源文件的实际大小替换上面的100M
这里是远程部分
虽然scp很难显示当前进度,将ddpv结合使用可谓小菜一碟。
dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv


评论


较新的dd的状态为=进度:askubuntu.com/a/824895/52975

– Ciro Santilli郝海东冠状病六四事件法轮功
2016年9月14日在16:20

#9 楼

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

cv -w


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

评论


看简历-q更整洁

– nwgat
2015年1月19日,0:42

它仅显示单个文件的进度,并且确实实现了cp是否递归复制目录。

– Flimm
16 Mar 31 '16 at 9:27

它把战争改名为进步。很棒的工具!

–塞巴斯蒂安
16年6月25日在14:42

#10 楼

如果您具有rsync 3.1或更高版本(rsync --version),则可以在保留权限和所有权的同时进行复制(cp -Rpn),递归目录,“无障碍”,并显示总体进度(而不是仅按文件显示进度),复制率和(非常粗糙)估计剩余时间:

sudo rsync -a --info=progress2 --no-i-r /source /destination


请注意,只有在处理您不拥有的目录/文件时才需要sudo。另外,如果没有--no-i-r,则在复制过程中的某些时候该百分比可能会重置为较低的数字。也许更高版本的rsync在info = progress2时默认为no-i-r,但在当前版本3.1.2中则不是。

我发现复制到已经包含文件的目录时(例如,当您通常使用cp -n“ no clobber”时),剩余的百分比和时间被高估了。 />

#11 楼

正如许多人所说,cp不包含此功能。

我只扔0.02美元,这对于平凡的复制情况(即,没有-R)我通常会做的事情: >查看文件的大小并记住
开始复制
打开另一个终端
在目标所在的目录上运行watch ls -lh DIR

这可以使我随时更新目标文件大小,而且麻烦最少。

作为不太琐碎情况的替代方法,例如递归复制目录,可以使用watch du -hs DIR查看DIR大小的摘要。但是du的计算可能会花费很长时间,甚至会减慢复制速度,因此您可能希望使用-n INTERVAL参数进行观察,以便可以进行折衷。

更新:如果使用通配符与watch du一起使用的命令,例如watch du -hs backup/*,别忘了引用:

watch "du -hs backup/*"


否则,当监视开始时,通配符将仅扩展一次,因此du将不会查看新文件/子目录。

评论


但是,不回答“速度”部分。

–阿洛瓦·马哈德(Alois Mahdal)
2012年11月16日下午13:21

#12 楼

dd status=progress

GNU Coreutils 8.24+(Ubuntu 16.04)中添加的选项:

dd if=src of=dst status=progress


终端显示以下类型的行:

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s

定期更新。

另请参阅:如何监视dd的进度?

评论


您的意思是:stdout是字符和vt100转义序列的流,使您的终端显示定期更新的行;)。 stdout始终是字节流,与它的显示方式无关(除非应用程序可以知道它当前是否已附加到终端...)

– masterxilo
18年9月4日在9:20

@masterxilo newbs不在乎,专家会知道;-)呵呵

– Ciro Santilli郝海东冠状病六四事件法轮功
18年9月4日在9:33

好吧,我认为陈述现状总是一件好事,也许遗漏了一些细节,但决不要使读者产生错误的思维模式。如果您说“ stdout是(定期更新的)行”,则似乎您是在说stdout是一个可变内存块,不是。即使对于新手来说,这一点也很重要。

– masterxilo
18年9月7日在9:09

#13 楼

根据您要执行的操作,可能是Midnight Commander(mc)的答案。我很惊讶尚未提及它。

pvrsync之类的工具很好地显示了一个大文件的传输进度,但是当复制整个目录/树时,mc会计算出大小然后很好地显示进度。另外,它在大多数系统上都是开箱即用的。

评论


“它在大多数系统上都是开箱即用的。” ...不在任何默认的Ubuntu安装上。

–muru
16年1月30日在17:58

#14 楼

使用外壳程序脚本:

 #!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "" "" 2>&1 \
      | awk '{
        count += $NF
            if (count % 10 == 0) {
               percent = count / total_size * 100
               printf "%3d%% [", percent
               for (i=0;i<=percent;i++)
                  printf "="
               printf ">"
               for (i=percent;i<100;i++)
                  printf " "
               printf "]\r"
            }
         }
         END { print "" }' total_size=$(stat -c '%s' "") count=0
}
 


外观如下:

% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================>                      ]


来源

#15 楼

pv知道如何监视给定pid的文件描述符,无论是cp还是其他内容

从文档:

   (Linux only): Watching file descriptor 3 opened by another process 1234:

          pv -d 1234:3

   (Linux only): Watching all file descriptors used by process 1234:

          pv -d 1234


示例:

md5sum file &
[1] + 1271 suspended
pv -d 1271
417MiB 0:00:17 [12,1MiB/s] [============>                                 ] 29% ETA 0:00:53

$ cp file.mov copy.mov &
[2] 3731
$ pv -d 3731
3:/media/windows/file.mov:  754MiB 0:00:04 [97,2MiB/s] [======================>                       ] 52% ETA 0:00:07
4:/media/windows/copy.mov:  754MiB 0:00:04 [97,3MiB/s] [     <=>                                                                   ] 


评论


这应该合并到所选答案中。

–于尔根·霍曼(JürgenHörmann)
20-2-5在13:07

#16 楼

这里已经有一些非常好的答案,但这是我最喜欢的命令,包括我自己在rsync命令上的小旋转,以及我最喜欢的选项:
1。如果已经运行watch 'du -hs',则cp允许您查看目标文件夹的大小:
如果您已经启动了一个较长的cp进程并且不想立即停止它,该怎么办?
假设您已经启动了此副本命令:
 # recursively copy source_dir_name to destination
cp -r source_dir_name destination
 

只需打开一个新终端,并进行复制操作,然后运行:
 # cd into destination directory
cd path/to/destination/source_dir_name
# Now watch, live, the size of this destination grow!
watch 'du -hs'
 

这将导致watch命令每2秒钟自动运行一次du -hs(默认值watch),这在目标目录中,因此您可以看到文件夹的大小实时增长!这不会给您带来一定的完成率,但是,如果您对要复制的内容的大小有一个大概的了解,那么在知道目的地不断增长的情况下,它肯定会让您有所观察并感觉良好。这是手表屏幕上的示例输出:

 Every 2.0s: du -hs

2.5G    .
 


这里您可以看到当前大小当前目录(.)的大小为2.5 GiB。要使手表使用较慢的更新间隔(例如5秒),只需将-n 5添加到watch命令中,如下所示:
 watch -n 5 'du -hs'
 

2。 rsync确实最适合:
我最喜欢的命令:
 # dry-run
time rsync -rah --dry-run --info=progress2 --stats source destination

# real copy (Important! Do a dry run first and read the
# output summary to ensure you're copying what you intend!)
time rsync -rah --info=progress2 --stats source destination
 

注意:time位于前面上面的命令仅输出最后一个操作的总运行时间的详细时间摘要。这可以在任何Linux命令之前起作用。
以下是rsync--stats摘要:如下所示:

 --dry-run 


额外阅读:

我对一些高级$ rsync -rah --dry-run --info=progress2 --stats /media/gabriel/cdrom ~/temp 2.76G 100% 2570.10GB/s 0:00:00 (xfr#3836, to-chk=0/4837) Number of files: 4,837 (reg: 3,836, dir: 1,001) Number of created files: 0 Number of deleted files: 0 Number of regular files transferred: 3,836 Total file size: 2.76G bytes Total transferred file size: 2.76G bytes Literal data: 0 bytes Matched data: 0 bytes File list size: 0 File list generation time: 0.001 seconds File list transfer time: 0.000 seconds Total bytes sent: 123.88K Total bytes received: 15.54K sent 123.88K bytes received 15.54K bytes 278.85K bytes/sec total size is 2.76G speedup is 19,792.78 (DRY RUN) 用法和内容的长答案:https://superuser.com/questions/1271882/convert-ntfs-partition-to-ext4-how-to-copy-the-data/1464264#1464264



#17 楼

还有一个保留属性的选项(如果source是一个文件夹,它将在destination中创建)

tar -c source | pv -e -t -p -r | tar -C destination  -x


希望对某人有用。要估算传输时间,可以通过预先执行do -s source并将其作为-s <size>参数传递到pv来实现。

评论


-f-是多余的。 tar的默认输出c和x的输入是stdout和stdin。

–muru
18-10-17在16:34



可能取决于OS / tar版本吗?我知道这是一个Ubuntu网站,但这可能对其他OS所有者(例如macOS)有用

– ciekawy
18-10-17在16:39

不。所有合理的实现(包括macOS使用的libarchive的tar)都具有此行为。

–muru
18-10-17在16:46

刚刚在macOS上进行了验证,您的建议完全有效-我已经更新了答案。谢谢!

– ciekawy
18-10-17在17:21

@muru WTF? TAR设计用于访问磁带机,因此得名(t代表“ tape”)!但是,后现代的tar实施变得疯狂,并且在不需要时放弃了对其最初命运的支持。早在1980年代,我就使用tar访问了磁带机,但是如今,这些完全相同的命令行由于没有充分的理由而失败,只是因为有人决定终止tar设计的默认功能。您仍然可以将磁带机连接到MacOS,为什么不支持该功能? tar的默认目标必须是磁带,否则tar是缺陷。期。

– Tino
20 Dec 15 '14:37

#18 楼

您可以使用手表
cp -r /path/to/your/file/or/dir ./dst

监视进度,并在第二个终端中观看进度
watch -n 0.1 du -h --max-depth=1


#19 楼

您可以使用任何程序进行复制。同时,您可以启动sudo iotop并查看实际的磁盘读/写速度,但没有任何进展。

#20 楼

在下面的git仓库中检查progress_bar的源代码。 />
下载deb文件并在基于debian的发行版中安装或下载源文件,修改并用于其他发行版

功能概述

(1)打开应用
---- Firefox
----计算器
----设置

(2)管理文件
----搜索
----导航
----快速访问

            |----Select File(s)
            |----Inverse Selection
            |----Make directory
            |----Make file
                                          |----Open
                                          |----Copy
                                          |----Move
                                          |----Delete
                                          |----Rename
                                          |----Send to Device
                                          |----Properties


(3)管理电话
----移动/从手机复制
----移动/复制到手机
----同步文件夹

(4)管理USB
----移动/从USB复制
----移动/复制到USB

#21 楼

由于linux原始cp没有此功能,因此我使用以下解决方案来获取进度信息:
cp -a source_directory destination_direcotry

在复制工作期间,创建另一个命令终端,并转到source_directory为:
cd source_directory
du -sm .

我获得了source_directory的总大小后,然后转到destination_direcotry进行相同的工作:
cd destination_direcotry
du -sm .

我可以通过比较destination_direcotry之间的总大小差异来获得复制进度和source_directory,您唯一需要做的额外工作就是打开cp终端之外的另一个终端,键入“ du -sm”。获取您正在处理的总目录大小。

#22 楼


安装gcp
sudo apt-get install gcp

注意:确保没有启用X11支持:
将以下行添加到'/ etc / ssh / sshd_config'
ForwardX11Trusted yes

安装
sudo apt-get install xauth
reboot

完成时:
gcp -rv SOURCE_FOLDER DESTINATION_FOLDER

或:
gcp SOURCE_FILE DESTINATION_FILE