Linux如何查看文件移动复制的进度

在最新版本的Mac OS X中,您只需按CTRLT即可查看进度。在OSX 10.6的cp(1)手册页中

 "If cp receives a SIGINFO (see the status argument for stty(1)) signal,
 the current input and output file and the percentage complete will be
 written to the standard output."

点击CTRLT等同于在BSD-ish机器(包括OSX)上使用SIGINFO指示当前进程。

这也适用于dd(1)

我不认为Linux具有这种SIGINFO机制,并且在cp(1)GNU手册页中看不到任何有关可用于报告进度的信号的信息。

 

一个相对较新的工具,正是这么做的进步(原CV [coreutils的浏览器])。

它是什么?

该工具可以描述为Tiny,Dirty,仅Linux和OSX的C命令,用于查找当前在系统上运行的coreutils基本命令(cp,mv,dd,tar,gzip / gunzip,cat等)。显示复制数据的百分比。

它是如何工作的?

它仅扫描/proc感兴趣的命令,然后查看目录fdfdinfo查找打开的文件并查找位置,并报告最大文件的状态。

 

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

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’-带有ASCII进度条的’cat’

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

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

请注意,这rsync并不能完全取代mv(OP在询问),尤其是在写入式复制文件系统(例如)上进行快速复制时btrfs

 

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

progress -w

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

您还watch可以说每2秒发生什么:watch progress -w
但是当移动一个包含许多文件的文件夹时,它仅显示当前文件的进度,而不显示整个文件夹的总数。作为替代,watch progress -w您也可以简单地使用progress -m

您可以使用管道查看器命令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 - source-dir | pv | tar xf - -C out-dir将为您提供整个目录的吞吐量。如果您知道大小并传递-s给PV,它也可以为您带来进步。

 

为了避免coreutil修补,以进度条的增加mvcpgcp(戈菲的复印机)是一个新的选择:http://wiki.goffi.org/wiki/Gcp/en

cp-r递归和-v详细说明选项使用相同的方式。

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

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

 

通过对目标文件和本地文件运行stat并获取文件大小,

即 stat -c "%s" /bin/ls

通过比较这两个值,您可以获得复制数据的百分比,仅此而已

在一个非常基本的实现中,它将如下所示:

function cpstat()
{
  local pid="${1:-$(pgrep -xn cp)}" src dst
  [[ "$pid" ]] || return
  while [[ -f "/proc/$pid/fd/3" ]]; do
    read src dst < <(stat -L --printf '%s ' "/proc/$pid/fd/"{3,4})
    (( src )) || break
    printf 'cp %d%%\r' $((dst*100/src))
    sleep 1
  done
  echo
}

资料:

https://qastack.cn/unix/2577/how-can-i-move-files-and-view-the-progress-e-g-with-a-progress-bar

https://qastack.cn/unix/66795/how-to-check-progress-of-running-cp

上一篇
下一篇