it-swarm.cn

如何移动文件并查看进度(例如,使用进度栏)?

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

129
letronje

您可以构建修补的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即可直接获得进度栏。

50
fschmitt

当有更简单的解决方案时,我不喜欢从coreutil覆盖二进制文件的想法,所以这是我的:

rsync:Rsync复制文件并具有-P切换进度条。因此,如果安装了rsync,则可以在shells dotfile中使用一个简单的别名:

alias cp='rsync -aP'

缺点是,rsync比cp慢一点,但是您应该随时间测量并决定自己,我可以忍受它:-)

Shell脚本:Shell脚本也可以创建进度条。我前一段时间在网上找到了这个,我不记得来源了:

#!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "${1}" "${2}" 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' "${1}") count=0
}

看起来像:

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

bar

'bar'-'cat'with ASCII进度条

bar是一个小的Shell脚本,用于显示所有操作(cp,tar等)的进程栏。您可以在 项目主页上找到示例。

它也为bourne Shell编写,因此它将在附近运行。

96
echox

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

progress -w

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

92
naugtur

您可以使用 管道查看器 命令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仅显示进度,不显示进度栏。

36
Lamnk

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

6
Christian Madsen

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

这是我将如何使用rsync移动带有进度报告的目录:

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

确保$src确实以反斜杠结尾not,否则您将获得与=不同的含义。 GNU cp)。

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

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

4
Tobia

首先:我永远不会在不使用ionice的情况下复制大文件,除非我知道半小时或更长时间不希望使用计算机。

第二:我的所有分区都是无节制的,因此分区内复制不会花费时间。如果是长副本,我会做du -sm上的文件和df -m | grep copy_to_partition。然后,如果想知道还需要多少时间,我会再次执行df并查看复制了多少文件。

2
HandyGandy

这不会给您进度条,而是按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%
2
Charles

在我的Mint上,我喜欢在此或curl-solution上使用gcp(这真的很好)

gcp SOURCE DESTINATION

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

对于进度条,这是一个非常不错的出色任务,其中包含以下信息:

  • 总计百分比
  • 收到的百分比
  • %Xferd
  • 平均DL
  • 速度上传
  • 剩下的时间
  • 所花费的时间
  • 总时间
  • 现在的速度

可读格式不错的是:

curl -o DESTINATION FILE://source

另外,您可能需要先安装Sudo apt-get install curl

2
ThePentadactyl

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

若要使用与cp相同的方式,并带有-r的递归性和-v的冗长性。

当同时调用多个命令时,它将使用文件队列。它还允许在日志中记录复制的文件名,有关详细信息,请参见源保存手册页部分。

这是一个很好的入门gcp的教程: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/

2
Yves Martin

采用 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获得的用于目录复制的进度信息

1
lesmana

我总是以寻找这个答案为目标after我启动了'mv'命令,这时我不想再次启动它。如果您处于这种情况,可以运行一种非常简单的方法来监视进度(或查看进度是否足够远以至于不值得杀死):

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

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

1
qazmonk

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

#!/usr/bin/env bash

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

它处理不止一个源和带有空格的文件名:

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