mv
移动大型目录时,是否可以查看进度(%)?gentoo上的
cp
命令具有一个-g
开关,用于显示进度。#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
我经常使用它在已安装的网络文件系统上复制大文件(与
gzip
和tar
结合使用) 。缺点是您只能复制一个文件,而不能复制目录。而且,您必须给新文件起一个名字,不能仅仅像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修补程序向mv
和cp
添加进度条,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
评论
在外壳中测量管道吞吐量可能会有所帮助,尽管我不知道在移动文件时是否可以轻松使用这些工具相关:复制进度,删除进度,比较进度,rsync进度。