< zed0> can you get cp to give a progress bar like wget?
Damn right you can.
#!/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 }
In action:
% cp_p /mnt/raid/pub/iso/debian/debian-2.2r4potato-i386-netinst.iso /dev/null 76% [===========================================> ]
**KadBmF...**
Kopieren auf der Bash mit Fortschrittsbalken!
gefunden bei Chris Lamb
Als root:
die Befehlsdatei anlegen:
touch /usr/bin/cp_p
und folgenden Inhalt mit dem Liebligs-Editor einfügen:
#!/bin/sh
cp_p()
{
set -e
strace -q -ewrite cp -- "${1}" ...
Grade-A bad-assery! My hat is off to you, sir!
why don't you use pv ?
and, this method works with -r ?
I'm trying to use this script but dot'n fully understand some things in it. Where does NF variable get from?
But doesn't strace make anything a billion times slower anyway?
Be aware, however, that this adds quite some overhead (30% to 50% in my tests) to the time needed to copy a file. A probably better way would be to use <code>dd</code> under the hood and get its progress status by <code>kill -USR1 $PID</code>. You lose all switches that <code>cp</code> understands, however.
In the end it would probably be better to add a switch to <code>p</code>.
Unfinished sample code (maybe Bashistic):
<code>
#!/bin/sh
if [ -d "$1" ]; then
echo "$1" is a directory - aborting.
exit
fi
if [ -d "$2" ]; then
OUTFILE="$2/"`basename "$1"`
else
OUTFILE="$2"
fi
dd if="$1" of="$OUTFILE" 2> &
PID=`pidof -s dd`
while [[ -x "/proc/$PID" ]]; do
kill -USR1 "$PID"
sleep 1
done
</code>
Great!
Mmh good hack but a nasty flea, printing of progression bar is on a new line every printing.
And I must admit I know none solution to this. Somebody have ?
sweet! i will check it out.
right now i have this with a patch for coreutils: http://forums.…
Fantastic! Scary, but fantastic!
you could do something similar with the fab "pv" tool:
pv bar
2.69MB 0:00:00 [70.3MB/s] [=================================>] 100%
That looks great. But some usage instructions would be helpful. Where do you put the script? How do you use it? If I paste that into gedit do I need to make it executable? etc
Apart from that, its a great idea :)
This is cool and all, but the overhead of strace make this not very useful. rsync -av shows a progress bar. You can also get a progress bar if you use scp locally. Yes, scp supports local file transfers without using any network or connecting to a local sshd instance.
jeff@omniscience:~$ du -h windows.tar.bz2
822M windows.tar.bz2
jeff@omniscience:~$ time cp_p windows.tar.bz2{,.new}
99% [====================================================================================================>]
real 2m18.957s
user 0m11.589s
sys 0m23.469s
jeff@omniscience:~$ ls window*
windows.tar.bz2 windows.tar.bz2.new
jeff@omniscience:~$ time cp windows.tar.bz2{,.new2}
real 1m39.597s
user 0m0.096s
sys 0m5.092s
If you feel the need to point out an alternative solution, then you have missed the entire point by a wide margin.
"...missed the entire point.."
Too right! :-)
Damn fine hack.
"AWK. Is there anything you cannot do."
I copy the function into my ~/.bashrc file. The problem is that when i try to use th cp_p command from a gnome-terminal, Terminal, xterm, etc. the commando print the update of the progress into a new line, and should do it on the same line, like show you example of use. Any solution?
Bwa ha ha ha ha ha.
Quite possibly the most wicked thing I have ever seen on Planet Debian.
And I do mean "wicked" in both the en_US@Boston sense and the ordinary one.
Bravo!
Muchas gracias, me ha servido de mucho. Siempre me pregunte como se podría hacer eso. es excelente!
Saludos!
omg this is genius! :)
kudos
nice.. thanks for this :D
what about something like this:
#!/bin/sh
curl "file://$1" -o "$2"
of course there could be a lot of improvements, but the idea is to use a tool that does progress. Something similar could probably be done with wget.
A very fine hack
David Dumortier:
To fix the flea use ANSI (escape codes that is)
The first time display an extra newline before drawing the bar.
Every time the bar is drawn; draw the ANSI to move the cursor UP one character.
Fine hack. Thanx.
you can add -s 1 to strace to lessen strace output
Very fast and dirty perl script to accomplish the same effect. It sure needs some polish.... but the effect is there.
Copy paste this text to a file named cp2 and do ./cp2
May need to change the location of perl on the first line, or do perl cp2 . 70+ Character terminal.
#!/bin/perl
use POSIX':sys_wait_h';
fork||exec('/bin/cp',@ARGV);
my $b1=(stat'calltree')[7];
select(undef,undef,undef,0.05);
while(!waitpid-1,WNOHANG){
$b2=(stat'calltree2')[7];
$sd=int(100*($b2/$b1));
$ss=(100-$sd)/2;
$ss++if$sd%2;
$|=1;
print" $sd% [".'='x($sd/2-1).'>'.' 'x($ss-1)."]
";
print"^H"x80;
select(undef,undef,undef,0.1);
}
[...]Linux: ???????? ??????? (? ???????? ?????). ??????????, ??... ???????! ?.?. ???????? ?? ?, ?????? ????????? ??? ?????.[...]
Nice , very Nice :-)
//Jadu
http://unstabl…
David Dumortier:
If you use 'echo -e "\r"', the cursor will move back to the beginning of the line. You could blank it out with:
echo -e "\r"
for i in `seq 1 $COLUMNS`; do
echo -n " "
done
echo -e "\r"
, although it would probably be better if you replaced $COLUMNS with a calculated number, rather than just setting 80 or the environment setting.
Also, if you would like to use @Stu 's solution, the following code /should/ work:
echo -e "\x1B[1A"
Where \x1B = ASCII ESC, and [1A is the ANSI code for move cursor up 1 line (see http://isthe.c…).
Remember, all the above require -e to echo - otherwise the escape sequences (\r, \x) just get printed out literally.
Nice bit it trickery there!
Does anyone have ideas on how to modify the script to handle file names that have spaces in them?
This is exactly what i wanted.Cheers mate.
Holy crap! This is awesome.
hahaha :)
I wonder if monitoring a running cp through /proc/<pid>/fdinfo/... wouldn't cause much less overhead than using strace.
Comments are closed as they are just too depressing to receive anymore.