LINUX.ORG.RU

Простой bash-скрипт и kdialog


0

1

Всем привет!

Решил написать простой скрипт, который копирует файл с флешки на жесткий диск. Хотел добавить к нему kdialog для информативности, но не получается. Если кто знает в чем проблема, помогите, пожалуйста.

Вот сам скрипт:

#!/bin/bash
file1=/media/disk/123.avi
file2=/home/wl/123.avi
dbusRef=`kdialog --progressbar "Копирование..." 100`

cp $file1 $file2 # сам процесс копирования

s1=`stat -c %s $file1` # размер общий
proc1=`expr $s1 / 100` # размер одного процента

for i in `seq 1 100`
  do
  s3=`expr $proc1 * $i` # размер и-того процента
  s2=`stat -c %s $file2` # размер уже скопированного
  if [ "$s2" = "$s3" ] # если с2 равно с3
  then
    qdbus $dbusRef Set "" value $i
    qdbus $dbusRef setLabelText "$i %"
  fi
   sleep 1
done

exit 0

kdialog --msgbox "Все скопировано"

★★★★

>cp $file1 $file2 # сам процесс копирования

Для начала, до завершения копирования дальше ничего не выполнится.

madcore ★★★★★
()
Ответ на: комментарий от Allakka

Или лучше «обернуть» все в цикл

while [ cp $file1 $file2 ] # так можно?
do
  все остальное тело скрипта
done

Allakka ★★★★
() автор топика
Ответ на: комментарий от Allakka

>while [ cp $file1 $file2 ]

Оно будет запускать cp бесконечное число раз, т.к. при удачном копировании цикл продолжается. При этом между итерациями будет копироваться файл. Т.е. будет бесконечный цикл из cp и «остального тела», которые будут поочерёдно запускаться.

gentoo_root ★★★★★
()
Ответ на: комментарий от Allakka

Ошибка в части кода [code] s3=`expr $proc1 * $i` # размер и-того процента [/code] вбиваю умножение в консоль - ошибка Хотя согласно expr --help все правильно

Allakka ★★★★
() автор топика
Ответ на: комментарий от Allakka

>Но теперь пишет expr: синтаксическая ошибка

expr $proc1 * $i

Надо '*' замаскировать: '\*'. bash подставляет вместо неё список файлов данного каталога.

gentoo_root ★★★★★
()
Ответ на: комментарий от Allakka

Есть подозрение на этот кусок кода

    qdbus $dbusRef Set "" value $i
    qdbus $dbusRef setLabelText "$i %"
я не напортачил с $i и %

Allakka ★★★★
() автор топика
Ответ на: хороший пример от uzbl

Сделал по примеру так

cp $file1 $file2 & (

s1=`stat -c %s $file1` # размер общий
proc1=`expr $s1 / 100` # размер одного процента

for i in `seq 1 100`
  do
  s3=`expr $proc1 \* $i` # размер и-това процента
  s2=`stat -c %s $file2` # размер уже скопированного
  if [ "$s2" = "$s3" ] # если с2 равно с3
  then
    (
    echo "$i" ; sleep 1
    echo "$i %" ; sleep 1
    ) |
    zenity --progress \
          --title="Копирование" \
          --text="Копирование..." \
          --percentage=0
    fi
   sleep 1
done

exit 0
)
Но даже окно zenity не появляется

Allakka ★★★★
() автор топика
#!/bin/bash

# file1="/media/disk/123.avi"
# file2="/home/wl/123.avi"
# SOURCE="source.bin"
# DEST="dest.bin"
SOURCE="${1}"
DEST="${2}"

# touch -- "${SOURCE}"
# touch -- "${DEST}"

DCOP_LINK=`kdialog --progressbar "Копирование..." 100`
# echo DCOP_LINK = \""${DCOP_LINK}"\"

# dcop "${DCOP_LINK}"
# sleep 2

# сам процесс копирования.
# "sleep 1" - чтобы успел запустится диалог.
sleep 2 && cp -- "${SOURCE}" "${DEST}" &
# cp -- "${SOURCE}" "${DEST}" &

SOURCE_SIZE=`stat -c %s "${SOURCE}" 2> /dev/null`
if [ "${?}" != "0" ]
then
    SOURCE_ERROR=`stat -c %s "${SOURCE}" 2>&1`
    #  echo Error. Source file error: "${SOURCE_ERROR}"     
    dcop "${DCOP_LINK}" close
    kdialog --error "${SOURCE_ERROR}"
    exit 1
fi

ONE_PERCENT=`expr "${SOURCE_SIZE}" / 100`

echo SOURCE_SIZE = "${SOURCE_SIZE}"
# echo ONE_PERCENT = "${ONE_PERCENT}"

while [ 1 = 1 ]
do
  
  # размер уже скопированного
  DEST_SIZE=`stat -c %s "${DEST}" 2> /dev/null` 
  # if [ "${DEST_SIZE}" = "" ]
  if [ "${?}" != "0" ]
  then
      DEST_SIZE=0
  fi  
  echo DEST_SIZE = "${DEST_SIZE}"

  if [ "${DEST_SIZE}" = "${SOURCE_SIZE}" ]
  then
      DEST_PERCENT=100
  else
      if [ "${DEST_SIZE}" = 0 ]
      then
          DEST_PERCENT=0
      else
          if [ "${ONE_PERCENT}" = 0 ]
          then
              DEST_PERCENT=0
          else
              DEST_PERCENT=`expr "${DEST_SIZE}" / "${ONE_PERCENT}"`
          fi
      fi
  fi

  # echo DEST_PERCENT = "${DEST_PERCENT}"
  
  dcop "${DCOP_LINK}" setProgress "${DEST_PERCENT}"
  # dcop "${DCOP_LINK}" setLabel "${DEST_PERCENT} %"

  if [ "${DEST_SIZE}" = "${SOURCE_SIZE}" ]
  then
      break
  fi

  # if [ "${DEST_SIZE}" > "${SOURCE_SIZE}" ]
  if [ `test "${DEST_SIZE}" -gt "${SOURCE_SIZE}" ` ]
  then
      # echo "Error. Ogogo !!!"
      # echo SOURCE_SIZE = "${SOURCE_SIZE}"
      # echo DEST_SIZE = "${DEST_SIZE}"
      dcop "${DCOP_LINK}" close      
      kdialog --error "Dest great source: SOURCE_SIZE=${SOURCE_SIZE}, DEST_SIZE=${DEST_SIZE}."
      exit 1
  fi
  
  # usleep 300
  # usleep 750
  # echo "1" >> "${DEST}"
  sleep 1
   
done

dcop "${DCOP_LINK}" close
kdialog --msgbox "Все скопировано."
someloruser
()
Ответ на: комментарий от Allakka

С zenity разобрался, сделал отдельно проценты

#!/bin/sh
(for i in `seq 1 100`
do
echo "$i" ; sleep 1
echo "# Скопировано $i %" ; sleep 1
done
) |
zenity --progress \
   --title="Копирование" \
   --percentage=0
а соединить с фактическими процентами не получается

man pv не возбуждает

Allakka ★★★★
() автор топика

вот у меня есть скрипт закачки из vk с прогрессбаром

#!/bin/sh

vkclient='/home/neko/.bin/under-development/vksearch'
to="/home/neko/Desktop"

track="$(kdialog --title 'Найти песню' --inputbox 'Название: ' --caption 'VKGui')"
[ -z "$track" ] && exit 1

wait_dialog="$(kdialog --title 'Ожидание загрузки' --caption VKGui --progressbar 'Ожидание начала загрузки...' 0)"
$vkclient "$track" --get-one &
until [ -f /tmp/vkclient.name ] ; do sleep 3s ;  done
qdbus $wait_dialog close

to_do=`cat /tmp/vkclient.size`
name="`cat /tmp/vkclient.name`"

wait_dialog=$(kdialog --title Закачка --caption VKGui --progressbar "$name" 100)
while [ true ] ; do
  if ! [ -f /tmp/vkclient.name ] ; then qdbus $wait_dialog close ; break ; fi
  already_done=`/bin/du -b "$name"|awk '{ print $1 }'`
  percent=`echo "scale=2; $already_done/$to_do"|bc|cut -d "." -f 2`
  qdbus $wait_dialog value $percent
  sleep 1s
done

mv "$name" "$to"
if kdialog --title Завершено --caption VKGui --yesno "Загрузка $name завершена. Открыть файл?"  ; then
 xdg-open "$to/$name"
else 
 exit 0
fi

snoopcat ★★★★★
()
Ответ на: комментарий от someloruser

Ого! Но все равно ошибка

DEST_SIZE = 11157504
ERROR: Couldn't attach to DCOP server!
и так далее с увеличением DEST_SIZE и прогрессбар не движется

Allakka ★★★★
() автор топика
Ответ на: комментарий от Allakka

Вот так попробуй:

(cp $1 $2) &

s1=`stat -c %s $1`

(while sleep 0.1; do

	s2=`stat -c %s $2`
	[ $s1 == "$s2" ] && break
	echo $[ $s2 / ($s1 / 100) ]

done) | zenity --progress --title="Копирование" --percentage=0
$1 и $2 - 1й и 2й аргументы скрипта.

uzbl
()
Ответ на: комментарий от Allakka

KDE4 DBUS

Тот пример с DCOP для KDE3.

А в KDE4 используется DBUS. Вот вариант с для KDE4

#!/bin/bash

# file1="/media/disk/123.avi"
# file2="/home/wl/123.avi"
# SOURCE="source.bin"
# DEST="dest.bin"
SOURCE="${1}"
DEST="${2}"

# touch -- "${SOURCE}"
# touch -- "${DEST}"

# DCOP_LINK=`kdialog --progressbar "Копирование..." 100`
DBUS_LINK=`kdialog --progressbar "Копирование..." 100`
# echo DCOP_LINK = \""${DCOP_LINK}"\"

# dcop "${DCOP_LINK}"
# sleep 2

# сам процесс копирования.
# "sleep 1" - чтобы успел запустится диалог.
sleep 2 && cp -- "${SOURCE}" "${DEST}" &
# cp -- "${SOURCE}" "${DEST}" &

SOURCE_SIZE=`stat -c %s "${SOURCE}" 2> /dev/null`
if [ "${?}" != "0" ]
then
        SOURCE_ERROR=`stat -c %s "${SOURCE}" 2>&1`
        #  echo Error. Source file error: "${SOURCE_ERROR}"     
        # KDE3.
        # dcop "${DCOP_LINK}" close
        # KDE4.
        qdbus ${DBUS_LINK} org.kde.kdialog.ProgressDialog.close
        kdialog --error "${SOURCE_ERROR}"
        exit 1
fi

if [ "${SOURCE_SIZE}" = "0" ]
then
    ONE_PERCENT=0
else
    ONE_PERCENT=`expr "${SOURCE_SIZE}" / 100`
fi
echo SOURCE_SIZE = "${SOURCE_SIZE}"
# echo ONE_PERCENT = "${ONE_PERCENT}"

while [ 1 = 1 ]
do
  
  # размер уже скопированного
  DEST_SIZE=`stat -c %s "${DEST}" 2> /dev/null` 
  # if [ "${DEST_SIZE}" = "" ]
  if [ "${?}" != "0" ]
  then
      DEST_SIZE=0
  fi  
  echo DEST_SIZE = "${DEST_SIZE}"

  if [ "${DEST_SIZE}" = "${SOURCE_SIZE}" ]
  then
      DEST_PERCENT=100
  else
      if [ "${DEST_SIZE}" = 0 ]
      then
          DEST_PERCENT=0
      else
          if [ "${ONE_PERCENT}" = 0 ]
          then
              DEST_PERCENT=0
          else
              DEST_PERCENT=`expr "${DEST_SIZE}" / "${ONE_PERCENT}"`
          fi
      fi
  fi

  # echo DEST_PERCENT = "${DEST_PERCENT}"
  
  # KDE3.
  # dcop "${DCOP_LINK}" setProgress "${DEST_PERCENT}"
  #### dcop "${DCOP_LINK}" setLabel "${DEST_PERCENT} %"
  # KDE4.
  qdbus ${DBUS_LINK} org.kde.kdialog.ProgressDialog.value "${DEST_PERCENT}"

  if [ "${DEST_SIZE}" = "${SOURCE_SIZE}" ]
  then
      break
  fi

  # if [ "${DEST_SIZE}" > "${SOURCE_SIZE}" ]
  if [ `test "${DEST_SIZE}" -gt "${SOURCE_SIZE}" ` ]
  then
        # echo "Error. Ogogo !!!"
        # echo SOURCE_SIZE = "${SOURCE_SIZE}"
        # echo DEST_SIZE = "${DEST_SIZE}"
        # KDE3.
        # dcop "${DCOP_LINK}" close
        # KDE4.
        qdbus ${DBUS_LINK} org.kde.kdialog.ProgressDialog.close
        kdialog --error "Dest great source: SOURCE_SIZE=${SOURCE_SIZE}, DEST_SIZE=${DEST_SIZE}."
        exit 1
  fi
  
  # usleep 300
  # usleep 750
  # echo "1" >> "${DEST}"
  sleep 1
   
done

# KDE3.
# dcop "${DCOP_LINK}" close
# KDE4.
qdbus ${DBUS_LINK} org.kde.kdialog.ProgressDialog.close

kdialog --msgbox "Все скопировано."

someloruser
()
Ответ на: комментарий от snoopcat

С этим не смог разобраться

already_done=`/bin/du -b "$name"|awk '{ print $1 }'`
percent=`echo "scale=2; $already_done/$to_do"|bc|cut -d "." -f 2`
Не могли бы Вы прокомментировать происходящее

Allakka ★★★★
() автор топика
Ответ на: комментарий от uzbl

УРА!

uzbl, спасибо Вам огромное! Прогрессбар начал двигаться!

Allakka ★★★★
() автор топика
Ответ на: KDE4 DBUS от someloruser

экий изврат.

(pv -n $src > $dest) | yad --text "Копирование..." --progress
ananas ★★★★★
()
Ответ на: KDE4 DBUS от someloruser

тоже не пашет [code] DEST_SIZE = 14000128 Cannot find 'org.kde.kdialog.ProgressDialog.value' in object /ProgressDialog at org.kde.kdialog-11105 [/code]

Allakka ★★★★
() автор топика
Ответ на: комментарий от Allakka

У меня прекрасно работает.

$ k4 kdialog --version
Qt: 4.7.0
KDE: 4.2.4 (KDE 4.2.4)
KDialog: 1.0

$ qdbus --version
:1.131
 org.kde.klauncher
:1.132
 org.kde.kded
:1.142
 org.kde.knotify
:1.161
org.freedesktop.DBus

someloruser
()
Ответ на: комментарий от someloruser
$ k4 kdialog --version
If 'k4' is not a typo you can use command-not-found to lookup the package that contains it, like this:
    cnf k4

$ qdbus --version
:1.1
 org.kde.klauncher
:1.10
 org.kde.ksmserver
 org.kde.ksmserver-2255
:1.11
 org.kde.kwin
 org.kde.kwin-2277
:1.110
 org.kde.konqueror-11735
:1.12
 org.freedesktop.Notifications
 org.kde.JobViewServer
 org.kde.StatusNotifierHost-2384
 org.kde.plasma-desktop
:1.124
 org.kde.kio_http_cache_cleaner
:1.125
:1.14
 org.kde.kaccess
:1.140
:1.149
:1.150
:1.17
 org.freedesktop.ScreenSaver
 org.kde.krunner
 org.kde.screensaver
:1.182
:1.185
:1.186
:1.188
 org.kde.kdesu-26769
:1.19
 org.kde.kmix
:1.2
 org.freedesktop.PowerManagement
 org.freedesktop.PowerManagement.Inhibit
 org.kde.Kephal
 org.kde.StatusNotifierWatcher
 org.kde.kded
 org.kde.network
 org.kde.powerdevil
 org.kde.synaptiks
:1.21
 org.kde.kbluetooth
:1.214
 org.kde.StatusNotifierItem-3252-12
:1.224
 org.kde.kate-4737
:1.226
 org.kde.kate-5465
:1.23
 org.kde.StatusNotifierItem-3207-1
:1.24
:1.249
 org.kde.ksysguard-9358
:1.273
 org.krusader
 org.krusader.krusader-11421
:1.275
 org.kde.kio_thumbnail-12367
:1.277
 org.kde.kio_thumbnail-12388
:1.278
 org.kde.kio_thumbnail-12389
:1.28
 org.gnome.GConf
:1.280
:1.29
 org.kde.klipper
:1.30
 org.kde.policykit1-kde
:1.33
 org.kde.knemo
:1.35
 org.kde.StatusNotifierItem-3205-1
:1.37
:1.38
:1.39
 org.openobex
:1.40
:1.47
:1.49
:1.5
 org.kde.kglobalaccel
:1.7
 org.kde.knotify
:1.73
:1.76
 org.kde.konsole
:1.83
:1.86
:1.90
org.freedesktop.DBus

Но это уже не важно. Zenity справляется

Allakka ★★★★
() автор топика
Ответ на: комментарий от Allakka

Возможно нужно сократить строки удалив «org.kde.kdialog.ProgressDialog.». Точку тоже удалить. Чтобы получились такие строки

qdbus ${DBUS_LINK} value "${DEST_PERCENT}"
qdbus ${DBUS_LINK} close

someloruser
()
Ответ на: комментарий от Allakka

все где может оказаться пробел или "-" в начале файла.

ciiccii
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.