当使用mv移动大型目录时,是否可以查看进度(%)?
gentoo上的cp命令具有一个-g开关,用于显示进度。

评论

在外壳中测量管道吞吐量可能会有所帮助,尽管我不知道在移动文件时是否可以轻松使用这些工具

相关:复制进度,删除进度,比较进度,rsync进度。

#1 楼

您可以构建修补的cp和mv,然后都支持-g开关以显示进度。此页面上有说明和补丁。但是:该页面指示您执行

$ sudo cp src/cp /usr/bin/cp
$ sudo cp src/mv /usr/bin/mv


,该操作会覆盖原始的cp和mv。这有两个缺点:首先,如果更新的coreutils软件包到达您的系统,则它们将被覆盖。其次,如果修补的版本有问题,它们可能会破坏依赖于标准cp和mv的脚本。我宁愿做这样的事情:

$ sudo cp src/cp /usr/local/bin/cpg
$ sudo cp src/mv /usr/local/bin/mvg


将文件复制到/ usr / local / bin,该文件供用户编译的程序使用,并赋予它们不同的名称。因此,当您需要进度条时,说出mvg -g bigfile /mnt/backup并正常使用mv。

也可以执行alias mvg="/usr/local/mvg -g",那么您只需要说出mvg bigfile /mnt/backup即可直接获取进度条。

评论


不幸的是,“此页面”上的补丁不再存在,并且似乎未在Web存档中建立索引。似乎有许多名称和功能相似的补丁,您可以编辑答案以弄清楚您的意思吗?

–吉尔斯'所以-不再是邪恶的'
16年7月9日在23:03

我认为github.com/atdt/advcpmv是有效的后继者,它具有相同的补丁程序,因此我更改了指向它的链接。

– fschmitt
16年7月11日在9:20

@fschmitt:此链接不再有效(404),但是有github.com/jarun/advcpmv。这类似于您链接到的链接吗?

–antiplex
20/12/04在12:04

#2 楼

有一个名为progress的新工具,它可以找到与正在运行的命令相关的任何描述符,并显示进度和速度:
此处可用

progress -w


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

评论


哇,我没想到这会真棒!我在安装后只输入了进度,它向我显示了我正在等待的mv命令的进度。谢谢!

– jredd
2015年9月30日在0:59



谢谢!当将内容作为根移动时,似乎必须使用sudo(我猜是同一用户)-您还可以使用watch来每隔2秒说一次发生的事情:watch progress -w

–野生
16年5月30日在20:13

很棒的程序,但是在移动时一个包含许多文件的文件夹,它仅显示当前文件的进度,而不显示整个文件夹的总数。除了查看进度-w,您还可以只使用进度-m

– mxmlnkn
16年11月13日在15:38

恕我直言,这是解决问题的最统一的方法。无需修补coreutils或使用未指定用于特定目的的工具(例如,用于mv的rsync)或编写过分杀伤的脚本,而应使用带有针对主题目的的工具。

–悲伤
16-12-28 at 1:54

最好的解决方案,直观。使用rsync时,我总是会检查man rsync。

–康拉德
20年9月4日在20:20

#3 楼

当有更简单的解决方案时,我不喜欢从coreutil覆盖二进制文件的想法,所以这是我的:
rsync:Rsync复制文件并为进度栏提供-P开关。因此,如果安装了rsync,则可以在shells dotfile中使用一个简单的别名:
alias cp='rsync -aP'

缺点是,rsync比cp慢一点,但是您应该随时间测量并确定为了您自己,我可以忍受它:-)
Shell脚本:Shell脚本也可以创建进度条。我前不久在网上找到了它,但我不记得它的来源:
#!/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
}
'bar'-带有ASCII进度条的'cat'

bar是一个小的Shell脚本,用于显示所有类型的操作(cp,tar等)的过程条。您可以在项目主页上找到示例。
它也是为bourne shell编写的,因此它将在附近运行。

评论


酒吧还没有包装MV。

–东武
2011年1月2日于23:04

相信shell脚本

– Lannk
2011年6月26日下午16:42

请注意,rsync不能完全取代mv(OP正在询问),尤其是涉及到像btrfs这样的写时复制文件系统上的快速副本时。

–卡尔·里希特(Karl Richter)
16年5月29日在14:40

它对mv有效吗?

–警报
20 Dec 1'在11:20

#4 楼

您可以使用管道查看器命令pv显示进度条:

pv /original/file > /new/file


我经常使用它在已安装的网络文件系统上复制大文件(与gziptar结合使用) 。缺点是您只能复制一个文件,而不能复制目录。而且,您必须给新文件起一个名字,不能仅仅像cp那样给目标目录起名字。但是,复制不是pv的目的。它是一个功能强大的工具,不仅可以复制文件,还可以做更多的事情。有关pv的更多示例,请参见主页。

更好的选择是使用rsync -aP。如果要改为mv,请附加标志--remove-source-files。如果要频繁使用以下命令,请将其添加到您的.bashrc中:

alias rscp='rsync -aP'
alias rsmv='rsync -aP --remove-source-files'


这里的缺点是rsync仅显示进度,而不显示进度栏。

评论


tar cf-源目录|光伏| tar xf--C out-dir将为您提供整个目录的吞吐量。如果您知道大小并将-s传递给pv,它也可以为您带来进步。

–arantius
18年2月10日在17:34

#5 楼

如果您的目标是使用进度条移动/复制目录,但避免使用非终端GUI,则mc(Midnight Commander)是一个不错的选择。

#6 楼

我的解决方案是使用rsync。它可以复制目录,在成功复制后删除源文件(从而“移动”它们)并显示进度报告,以及许多其他功能(最值得注意的是同步部分复制的目录并通过网络工作。)

这里是我如何使用rsync移动目录以及进度报告:

rsync -aP --remove-source-files $src $dst && rm -r $src


确保$src不会以反斜杠结尾,否则您将获得不同的含义比GNU cp还要大。

最后一个rm -r是必需的,因为--remove-source-files仅在成功复制每个源文件之后才删除源文件,而不是目录。 &&确保仅在rsync成功完成时才运行它。如果您偏执狂,则可以用某种递归rmdir代替它,例如find $src -d -exec rmdir {} +

唯一的问题是-P选项显示每个文件的进度,而不是整个复制操作的进度。如果您尝试移动包含许多小文件的目录,这可能没有用。最新开发的rsync版本具有备用标志--info=progress2,该标志显示整个操作的进度。

#7 楼

为避免coreutil修补程序向mvcp添加进度条,gcp(Goffi的CoPier)是一种新的替代方法:http://wiki.goffi.org/wiki/Gcp/en

要使用相同的方法方式与cp相同,其中选项-r用于递归,-v用于冗长。

同时调用多个命令时,它使用文件队列。它还允许将复制的文件名记录在日志中,有关详细信息,请参见“源代码保存手册”部分。 cp启发的高级命令行文件复印机/

评论


是否有类似gcp的gmv for cp?

–CodyChan
16年9月1日在6:07

我没有找到对等的东西。顺便说一句,当在单个文件系统上运行“ mv”时,不需要进度条……它非常快。如果移动是在两个不同的文件系统上完成的,则将其实现为cp,如果成功,则删除源,如果失败,则删除目标。一个简单的基于gcp的shell脚本可以正确地执行此操作(首先检查一下源和目标是否确实在不同的文件系统上)

–伊夫·马丁(Yves Martin)
16年9月1日在6:23

#8 楼

首先,我永远不会在不使用ionice的情况下复制大文件,除非我知道半小时或更长时间都不想使用计算机。没有时间。如果是长副本,请对文件和du -sm执行df -m | grep copy_to_partition。然后,如果想知道还需要多少时间,请再次执行df,然后查看复制了多少文件。

评论


您愿意分享您的ionice技巧吗?您会优先考虑将cv-wise和磁盘i / o设置为mv吗?这是我的设置,但是即使重新登录后,CPU负载仍然很高:imgur.com/a/DLMJplz

–ychaouche
19年2月17日在11:55



#9 楼

在我的Mint上,我想在此或curl-solution上使用gcp(这非常好)

gcp SOURCE DESTINATION


您可能需要安装sudo apt-get install gcp

对于进度条而言,这是一项非常出色的出色任务,其中包含有关


%Total
%收到的
%Xferd
平均DL
速度上传
剩余时间
花费的时间
总时间
当前速度

,一种可读性很好的格式是:

curl -o DESTINATION FILE://source


此外,您可能需要先安装它sudo apt-get install curl

评论


gcp不支持文件移动,即在成功复制后必须手动删除源文件。

–卡尔·里希特(Karl Richter)
16年5月29日在14:31

#10 楼

这不会给您进度条,而是按CTRL-T,您将向SIGINFO发送一个mv,它将报告该文件正在处理哪个文件以及处理过程如何。对于大型文件传输非常方便,对于传输许多小文件可能不那么有用。

快速示例:

mv 135/61 /Volumes/Jules/135/
# hit C-t
load: 1.08  cmd: cp 35470 uninterruptible 0.00u 0.04s
135/61/1/1-s2.0-S006738-main.pdf -> /Volumes/Jules/135/61/1/1-s2.0-S006738-main.pdf  68%


评论


这对我不起作用:我收到INFO:未知信号; killall -l列出信号。我认为SIGINFO仅在某些BSD上,而不在标准POSIX中。

–布赖恩·明顿(Brian Minton)
16-8-26在21:42



对。它确实可以在Mac OS X中运行,但可能无法在Ubuntu中运行。

–查尔斯
16年8月27日在9:12

#11 楼

使用mv -v每个移动文件打印一行,并使用pv -l根据行数(有效文件数)打印进度。

您将需要pv(管道查看器):http://www.ivarch。 com / programs / pv.shtml

mv -v sourcedir targetdir | pv -l -s filecount > logfile


使用以下命令获取文件数:

find sourcedir | wc -l


该命令将根据复制的文件数显示进度信息。如果有许多较小的文件,则效果最好。如果只有几个文件很大,那么您将不会获得太多乐趣。

请注意,同一分区上的mv应该很快。 mv到另一个分区将与cp source target相同,后跟rm source。因此,这里有两个命令用于复制带有进度信息的目录。

根据复制的文件数报告进度:

cp -av sourcedir targetdir | pv -l -s filecount > logfile


报告进度基于复制的字节:

tar c sourcedir | pv -s size | tar x -C targetdir


有关更多详细信息,请参见此处:通过pv进行目录复制的进度信息

#12 楼

我总是在启动“ mv”命令后最终找到该答案,此时我不想再次启动它。如果您在这种情况下,可以使用一种非常简单的方法来监视进度(或查看进度是否足够远,以至于不值得杀死):

du -hs /directory/you're/moving/data/to


这只会打印目录的大小,因此您可以查看已复制了多少数据,也可以运行几次以查看数据传输的速度。

#13 楼

我使用以下以rsmv名称保存的脚本:

#!/usr/bin/env bash

rsync -aP --remove-source-files "$@" && rm -rf "${@:1:$#-1}"


它处理多个源文件和带空格的文件名:

$ rsmv source1 source2 source\ 3 "source 4" dest


评论


--remove-source-files不能完成删除吗?为什么&& rm ...在那里?

– Jeff Schaller♦
19/12/17在12:59

否则,这与现有答案非常相似:unix.stackexchange.com/a/184943/117549和unix.stackexchange.com/a/15656/117549

– Jeff Schaller♦
19年12月17日13:00

--remove-source-files仅删除文件。因此,如果源参数包含目录,则不会删除它们。 rm ...处理此类目录的删除。

– mixel
19/12/17在13:03

是的,它是更接近于mv的改进版本,因为它处理许多源参数。

– mixel
19/12/17在13:04