在最新版本的Mac OS X中,您只需按CTRL+ T即可查看进度。在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."
点击CTRL+ T等同于在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
感兴趣的命令,然后查看目录fd
并fdinfo
查找打开的文件并查找位置,并报告最大文件的状态。
您可以构建修补的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修补,以进度条的增加mv
和cp
,gcp
(戈菲的复印机)是一个新的选择:http://wiki.goffi.org/wiki/Gcp/en
cp
与-r
递归和-v
详细说明选项使用相同的方式。
当同时调用多个命令时,它将使用文件队列。它还允许在日志中记录复制的文件名,有关详细信息,请参见“ 源保存手册”部分。
这是一个很好的入门指南gcp
:http : //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