[bash-Xdialog] Voortgang van kopieren

Pagina: 1
Acties:

  • MichielioZ
  • Registratie: Augustus 2001
  • Laatst online: 17-02 21:23
Ik probeer met een bash-scriptje de voortgang van een kopier-proces bij te houden. Deze voortgang zou dan in een Xdialog-venster grafisch moeten worden weergegeven.
Ik heb flink gegoogled, maar kon hiervan helaas geen voorbeeld vinden :'(
Ik ben toen maar gaan proberen om zelf creatief te zijn, maar blijkbaar ben ik niet creatief genoeg...
De input voor Xdialog moet in procenten worden ingevoerd, dus heb ik gezocht naar een manier om het percentage van het kopier-proces te berekenen, maar dat lukt dus steeds niet. De volgende code heb ik geprobeerd :
(
cp -a -v -x /folder1/* /folder2
)>/tmp/copy.log 2>&1

# Progres window
(
while true
do
TOTALSIZE=`du -bc /folder1 | tail -n1 | tr -d total | tr -d [:blank:]`
FILESIZE=`du -b /tmp/copy.log|awk '{print $1}'`
echo $((100*$FILESIZE/$TOTALSIZE))
sleep 1
done
)|Xdialog --progress "Copying files..." 0 0

Ik heb 't ook geprobeerd met rsync te doen, maar de --progress optie van rsync geeft procenten van afzonderlijke files weer, niet het totaalproces :(
Misschien kan iemand hier mij ermee helpen...

Iedereen wil terug naar de natuur, maar niemand wil lopend...


Verwijderd

straks als ik weer thuis ben krijg je wat scriptjes van me (m'n laptop staat nu al uit, en ik ga zo naar huis), als je btw gtk2 op die bak hebt staan, is zenity wellicht interesanter dan xdialog (daar zenity xdialog+gtk2 is)

[ Voor 14% gewijzigd door Verwijderd op 27-02-2004 17:35 ]


  • A_L
  • Registratie: Juni 2001
  • Niet online

A_L

Snel even wat ingeklopt, en het werkt met dialog. (heb geen Xdialog).

Is geen mooie code, want hij stopt niet bij honderd %,etc. ,etc., meer een "proof of concept" :*)

Het verbeteren is aan je zelf. 8)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash

#eerst totale grootte berekenen van de te kopieren bestanden
#kan even duren...
totalsize=`du -b -c /tmp/folder1|tail -n1|cut -f1`

#kopieren maar.
cp -rf /tmp/folder1 /tmp/folder2&

# Progres window
(
while true
do
FILESIZE=`du -b -c /tmp/folder2|tail -n1|cut -f1`
echo $((100*$FILESIZE/$totalsize))
sleep 1
done
)|dialog --title "GAUGE" --gauge "Copying files..." 20 70 0

Verwijderd

Hier een variant met zenity. 1 ding wat ik hier anders doe, is dat ik cp per file aanroep in plaats van alle files in een keer:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/sh

NR_TEST_FILES="100"
SRC="test/a"
DST="test/b"

# Prepare test directories and files
[ -d "${SRC}" ] && (echo "cleaning up ${SRC}"; rm -rf ${SRC})
[ -d "${DST}" ] && (echo "cleaning up ${DST}"; rm -rf ${DST})
mkdir -p ${SRC} ${DST}
echo "preparing ${NR_TEST_FILES} testfiles: "
for i in $(seq ${NR_TEST_FILES}); do
        echo "simsalabim" > ${SRC}/${i}
done

# Do the actual operation
NR_FILES="$(ls ${SRC} | wc -l)"
INTERVAL="$(expr 100 / ${NR_FILES})"
i=0
echo "starting file copy"
(for f in $(seq 1 1 ${NR_FILES}); do
        OUT="$(cp -v ${SRC}/${f} ${DST}/)"
        i="$(expr $i + ${INTERVAL})"
        sleep 0.1        # Sleep, so we can actually see the
                         # dialog on a box with fast disks
        echo "#${OUT}"
        echo "${i}"
done
echo "#Done copying files"
echo "100") | zenity --progress --title="file copy in progress"

exit 0


Have fun :)

  • A_L
  • Registratie: Juni 2001
  • Niet online

A_L

En als je nou 1 bestand hebt van een paar honderd mb? >:)

Je telt alleen de voortgang van het aantal bestanden (als ik dat zo snel bekijk) en niet de voortgang van het aantal mb's.

  • MichielioZ
  • Registratie: Augustus 2001
  • Laatst online: 17-02 21:23
Bedankt voor de code jongens, maar helaas werkt het nog niet voor mij... 8)
Het "per file" of "per directory" kopieren van r3boot heb ik op dit moment zelf ook met een "gauge-dialog" en dan elke keer met ' echo "20"; echo "40" ' etc.
De code van A_L is praktisch dezelfde als die ik eerst gaf, alleen dan met de
--gauge ipv --progress... als deze echter loopt (nog niet geprobeerd), kan je (of ik) met --progress een MAX_VALUE toekennen, waardoor ie wel tot 100% zou moeten komen...
Iig bedankt, ik ga het gelijk even uittesten.

Iedereen wil terug naar de natuur, maar niemand wil lopend...


  • MichielioZ
  • Registratie: Augustus 2001
  • Laatst online: 17-02 21:23
Ik ben er uit !! :*)
Bij deze bedank ik A_L nogmaals voor zijn code, want het bleek dat ik het
"&"-teken vergeten was in mijn code... 8)7
Voor de mensen die de werkende code willen weten :
code:
1
2
3
4
5
6
7
8
9
MAXVAL=99
TOTALSIZE=`du -bc /source-dir | tail -n1 | tr -d total | tr -d [:blank:]`
cp -Rp /source-dir/* /destination-dir &
(
PERCENT=0
while [ "$PERCENT" -le "97" ]; do
FILESIZE=`du -bc /destination-dir | tail -n1 | tr -d total | tr -d [:blank:]`
PERCENT="$((100*$FILESIZE/$TOTALSIZE))"; echo $PERCENT; done
) | Xdialog --progress "Copying files..." 10 38 $MAXVAL -

[ Voor 16% gewijzigd door MichielioZ op 28-02-2004 16:30 ]

Iedereen wil terug naar de natuur, maar niemand wil lopend...


  • A_L
  • Registratie: Juni 2001
  • Niet online

A_L

Het kan ook door de kijken of het "cp"-proces nog loopt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

#eerst totale grootte berekenen van de bron-directory
totalsize=`du -b -c /tmp/folder1|tail -n1|cut -f1`

cp -rf /tmp/folder1/* /tmp/folder2&
pid=$! #Process-id van het cp-proces

(while ps -p $pid 2>/dev/null >/dev/null #zolang het cp proces draait.
do
    sleep 1
    FILESIZE=`du -b -c /tmp/folder2|tail -n1|cut -f1`
    #om de seconde de grootte van de doel-directory achterhalen
    echo $((100*$FILESIZE/$totalsize))
done)|Xdialog --gauge "Copying files..." 0 0 0

#xdialog --progress schijnt een voorloop nul te willen hebben?!
#bij 1 krijg ik 11 en bij 2 krijg i 22..... #--gauge werkt wel goed

exit 0
Het grootte nadeel ten opzichte van het aantal bestanden tellen, is dat het draaien van "du" op het begin veel tijd kost. Ook moet de doel directory leeg zijn, anders krijg je een verkeerde weergave.

[ Voor 15% gewijzigd door A_L op 28-02-2004 21:54 . Reden: --gauge gebruikt / sleep vergeten ]

Pagina: 1