你的位置:

问答吧

-> Shell

-> 问题详情

怎么让cp显示拷贝的进度或者速度?

怎么让cp显示拷贝的进度或者速度?

作者: gybcb

发布时间: 2003-07-03

这个需要写一个进度条的脚本,脚本区里有如何写进度条的例子,你看看!

http://www.linuxsir.com/bbs/showthre...threadid=29701

作者: KornLee

发布时间: 2003-07-03

那个脚本只是画一个进度条而已!

我怎么知道文件实际拷贝了多少呢?

作者: gybcb

发布时间: 2003-07-03

:(,

思路应该是这样的吧~

首先计算要拷贝的文件的整个块的大小,然后按照百分比例分成n个小块,把这个n的数量交给类似dialog的程序处理,

(我也没有实现呢!望探讨)

作者: KornLee

发布时间: 2003-07-03

如果用c/c++或者别的语言写得话的确是这样。

关键现在怎么样可以重用cp呢?

或者说cp也可以把一个文件分成几块分别拷贝?

(请指教)

作者: gybcb

发布时间: 2003-07-03

重写cp吧

好歹人家源程序都给你了。。

作者: lucida

发布时间: 2003-07-03

我也这么想过!

不过....

(说来惭愧我没找到源码包)

:P

作者: gybcb

发布时间: 2003-07-03

引用:

重写cp吧

好歹人家源程序都给你了。。我个人看没那个必要吧!像dialog/Xdialog等工具都可以做到的(比如作些安装程序等)!但是为了显示一个进度条而改写cp,是不是舍简求繁了呢?!

作者: KornLee

发布时间: 2003-07-03

to javalee:

那怎么样可以取得当前拷贝的一些消息呢?

cp有没有什么可以设置回调函数的方法,或类似的方法呢?

:)

作者: gybcb

发布时间: 2003-07-03

引用:

最初由 javalee 发表

我个人看没那个必要吧!像dialog/Xdialog等工具都可以做到的(比如作些安装程序等)!但是为了显示一个进度条而改写cp,是不是舍简求繁了呢?!这个问题是这样,如果文件不多,而且不考虑目录深度,当然可以用dialog

但是,如果是一个通用解决方案,假设我要把一个带上万文件的复杂目录cp到另外一处,这样的方法肯定是毫无效率的, 或者是,只有一个大文件,希望在复制中实时显示进度,这些都是dialog无法实现的。。

btw,cp的源码在

http://www.gnu.org/software/fileutils/fileutils.html

我只能说,如果楼主真有这样的需求,那就自己重写一个cp,显示每个文件的具体复制进度,这个很简单的。如果只是为了学习shell,大可以放弃这个想法。

作者: lucida

发布时间: 2003-07-03

我的需求就是要拷贝一个大文件的时候,显示进度!

因为我经常在网上拷贝比较大的单个文件,1G-2G这会比较慢,所以我需要一个进度条来显示拷贝文件的进度。

to penny:

我上这儿来问这个问题是,我觉得cp因该已经提供这个功能了,我只是不知道这个参数而已。

源码收到了,晚上看一下代码。

多谢!

to javalee:

多谢斑竹的热心帮助!Thanks!

作者: gybcb

发布时间: 2003-07-04

penny

★☆

注册日期: Oct 2002

来  自: .:ET8.NET:.------???

发贴数量: 539

penny兄,我想问一下你现在在哪个城市啊?

作者: gybcb

发布时间: 2003-07-04

不需要修改cp代码,可以检测 dest-file 的大小,和 source-file 对比就可以知道进度了。

作者: idkey

发布时间: 2003-07-04

这个问题我认为值得讨论!

我有个提议,咱们也立个项,大家都动动脑筋,写一个在拷贝过程中显示进度的脚本,如何?

欢迎参与~~~~~~~~~~~~~

作者: KornLee

发布时间: 2003-07-05

代码:

#!/bin/sh

# Last modified: 2003年07月05日 星期六 00时09分44秒 [test]

SOURCE=$1

TARGET=$2

#CP=./fack_cp

CP=cp

$CP "$SOURCE" "$TARGET" &

CPID=$!

isalive(){

out=`ps -p $1 2> /dev/null`

return $?

}

while [ 1 ]; do {

SSIZE=`/bin/ls -l $SOURCE | gawk "{print \\\$5}"`

if [ -f $TARGET ]; then

TSIZE=`/bin/ls -l $TARGET | gawk "{print \\\$5}"`

else

TSIZE="0"

fi

PERCENT=`echo "scale=2; $TSIZE/$SSIZE*100" | bc -l`

RATE=`echo "scale=0; 63*$PERCENT/100" | bc -l`

BLUE="\\033[3;44m"

NORMAIL="\\033[0;39m"

BAR=$BLUE

i=0

while [ $i -le 62 ]; do

[ $i = $RATE ] && BAR=$BAR"\\033[7;39m"

BAR=$BAR" "

let i=$i+1

done

BAR=$BAR$NORMAIL

echo -en "\r$BAR ${PERCENT}%"

if ! isalive "$CPID"; then echo -en "\n"; exit; fi

sleep 1

}

done

作者: idkey

发布时间: 2003-07-05

晕~~~~~那么快!佩服!!!

收藏,好好研读研读!把他移植到xdialog下试试看

作者: KornLee

发布时间: 2003-07-05

我给个算多文件大小的函数。

csize(){

C=0

INRC=0

for file in $1

do

INRC=`ls -l $file | awk "{print \\\$5}"`

let C=$C+$INRC

done

return $C

}

作者: lordbyorn

发布时间: 2003-07-05

to idkey

Thanks!

作者: gybcb

发布时间: 2003-07-08

我正愁干什么?现在

能给我提点意见吗?我该如何入门写脚本???看了兄弟们的贴子,水中看花(人在水中,眼很难受)!

谢谢,首先

作者: wangfaming1221

发布时间: 2003-07-08

兄弟别急,脚本,是根据自己的需要而编写的,而不是为了什么!

编写脚本的初衷是为了完成某些任务或者简化某些过程以提高工作效率!当然,简单的任务可以在命令行下就可以完成,这就是shell!!!

建议兄弟先看看置顶入门的贴子和精华区里的贴子吧~~~

作者: KornLee

发布时间: 2003-07-09

Logo

更多推荐