Отображение общего прогресса в rsync: возможно ли это?


231

Я уже искал эту опцию, но нашел только решения, которые включают пользовательские исправления . Тот факт, что он не отображается в --help и больше информации не может быть найдено, вероятно, указывает на то, что ответы - «нет», но я бы хотел, чтобы это подтвердилось.

Можно ли показать общий прогресс передачи файлов с помощью rsync?


22
Начиная с rsync 3.1.0, теперь включен базовый общий прогресс передачи файлов. См. Ответ serverfault.com/a/441724/107793 для получения подробной информации.
Флориан Фельдхаус

14
Пожалуйста, измените принятый ответ. @ Ответ Дэвида совершенно бесполезен.
Навин

Ответы:


36

Данаким это правильно. Нет простых способов добавить индикатор общего прогресса.

Причина этого заключается в том, что, когда rsync просматривает список файлов для синхронизации, он не знает заранее, какие файлы нужно будет изменить. Если вы выполняете дельта-переводы, сами дельты должны быть рассчитаны заранее, чтобы дать полную картину работы, которую необходимо выполнить.

Другими словами, самый простой способ подсчитать, сколько работы предстоит сделать, - это сделать это на самом деле.


42
У вас все еще может быть простой индикатор, такой как (данные переданы + данные пропущены) / (общее количество данных в источнике) или (# файлов передано или пропущено) / (# файлов в источнике). Это не будет особенно точным, но это дало бы идею. Хорошо, когда вы делаете большую передачу в конце дня, и вам интересно, подождать ли и выключить компьютер или оставить его работать на ночь ...
naught101

3
Я не верю, что вывод правильный. Я думаю, что @ naught101 является более справедливым по отношению к этому вопросу, и я думаю, что предикат ответа о том, что он не используется --size-onlyили тому подобное, является еще более неточным.
Эван Кэрролл

2
В то время, когда я писал ответ, он был точным - у rsync не было механизма для индикатора общего прогресса. И да, вы могли бы написать свое, но мало кто бы это написал.
Дэвид Макинтош

6
Комментарий для новичков: теперь это возможно: serverfault.com/a/441724/422003
imposeren

использование двух проходов, во-первых с «--dry-run» (общее ожидаемое количество файлов) и во-вторых с подробным выводом, записанным в файл (и подсчет завершенных строк или использование канала до «pv»), позволяет легко оценить завершение. Недостатком является двойное сканирование больших вложенных каталогов. В зависимости от необходимости, то есть обеспечения безопасной миграции данных клиента, это может быть приемлемым.
Ives

378

Теперь есть официальный способ сделать это в rsync (протокол версии 3.1.0, версия 31, протестировано с Ubuntu Trusty 14.04).

#> ./rsync -a --info=progress2 /usr .
    305,002,533  80%   65.69MB/s    0:00:01  xfr#1653, ir-chk=1593/3594)

Я попытался с моей /usrпапкой, потому что я хотел эту функцию для передачи целых файловых систем, и, /usrказалось, был хорошим представительным образцом.

Это --info=progress2дает хороший общий процент, даже если это только частичное значение. На самом деле моя /usrпапка более 6 гигов:

#> du -sh /usr
6,6G    /usr/

и rsyncпотребовалось много времени, чтобы просмотреть все это. Таким образом, почти всегда процент, который я видел, был выполнен на 90%, но, тем не менее, приятно видеть, что что-то копируется :)

Рекомендации:


19
Обратите внимание, что это появилось в 3.1.0. Также важно отметить, что это не обязательно точно с точки зрения времени. По сути, он показывает объем данных, которые были проверены на наличие на удаленном конце. А скорость - это скорость, с которой данные изучаются на удаленном конце как правильные (было ли это уже так или новые данные были переданы и исправлены). Так что, хотя и очень полезно, вам нужно понимать предостережения.
Кевин Кокс

15
Чтобы использовать это на OSX с homebrew, «brew tap homebrew / dupes; brew install rsync»
Мэтт Кэрриер,

18
Стоит отметить, что --info=progress2не работает с-v
Sanmai

42
Добавьте --no-i-rкоммутатор также, чтобы rsyncон не сканировал пошагово, но полностью перед копированием и знал + показывает, сколько работы осталось.
Алекс

16
Обратите внимание, что вы можете использовать --human-readable(или -h), чтобы увидеть общий размер в МБ / ГБ .. в процессе.
Nux

46

Вы можете с помощью 'pv' ( apt-get install pvс Debian и Ubuntu). Я рекомендую отслеживать количество переданных файлов, поскольку объем передаваемых данных зависит не от размера файлов, а от разницы между источником и местом назначения. И подсчет файлов будет считать одинаковый прогресс для одной большой дельты и другой с маленькой дельтой. Это означает, что в любом случае оценка ETA может быть далека. ETA на основе размера работает только в том случае, если пункт назначения пуст, в этом случае delta == размер источника.

Общая идея состоит в том, чтобы выдавать одну строку на файл, «переданный» из rsync, и считать эти строки с помощью «pv»:

rsync -ai / source remote: / dest | pv -les [количество файлов]> / dev / null

Я имею тенденцию делать резервные копии целых файловых систем (по нескольким причинам), в этом случае вы можете использовать гораздо более дешевое dfдля получения количества файлов (а не duили, который findбудет пересекать вашу исходную иерархию в другой раз после того, как rsync это сделал). Опция -x позволяет убедиться, что rsync остается в той же исходной файловой системе (и не следует за другими внутренними монтируемыми файлами):

rsync -aix / source remote: / dest | pv -les $ (df -i / source | perl -ane 'print $ F [2], если $ F [5] = ~ m: ^ /:')> / dev / null

Если вы хотите считать файлы в / source обычным способом, используйте find /source|wc -l(еще раз предупреждение: может быть медленным и тяжелым при вводе / выводе).


1
Как указано в zerodeuz, используйте «df» только тогда, когда вы выполняете повторный вызов всего раздела, так как df -i /sourceполучает число inode (файлов) от всех разделов, в которых находится / source. В противном случае используйте 'find' для подсчета файлов в каталоге внутри выражения "$ ()".
Лепе

1
Альтернатива duили find- скажем, вы заканчиваете неполную копию или делаете обновление на месте с удалениями - это использовать rsync -ai --dry-runдля получения того же списка файлов, на который будет передаваться основной прогонpv
Изката

32

Следующее относится к rsync версии 3.0.0 и выше. Опции, описанные ниже, были представлены в этом выпуске 1 марта 2008 года.

Наряду с --info = progress2 вы также можете использовать параметр --no-inc-recursive (или его более короткий псевдоним --no-ir ), чтобы отключить инкрементную рекурсию.

Это создаст весь список файлов в начале, а не будет постепенно обнаруживать больше файлов по мере передачи. Поскольку он будет знать все файлы перед запуском, он даст лучший отчет об общем прогрессе. Это относится к числу файлов - он не сообщает о каком-либо прогрессе в зависимости от размера файла.

Это предполагает компромисс. Создание полного списка файлов заблаговременно требует больших затрат памяти и может значительно задержать начало фактической передачи. Как и следовало ожидать, чем больше файлов, тем больше будет задержка и больше памяти.

Следующее из руководства rsync (источник - http://rsync.samba.org/ftp/rsync/rsync.html ):

-r, --recursive

Это говорит rsync о рекурсивном копировании каталогов. Смотрите также --dirs (-d). Начиная с rsync 3.0.0, используемый рекурсивный алгоритм теперь представляет собой инкрементное сканирование, которое использует намного меньше памяти, чем раньше, и начинает передачу после завершения сканирования первых нескольких каталогов. Это инкрементное сканирование влияет только на наш алгоритм рекурсии и не меняет нерекурсивную передачу. Это также возможно только тогда, когда оба конца переноса имеют версию не ниже 3.0.0.

Некоторые параметры требуют, чтобы rsync знал полный список файлов, поэтому эти параметры отключают режим инкрементной рекурсии. К ним относятся: --delete-before, --delete-after, --prune-empty-dirs и --delay-updates. Из-за этого режим удаления по умолчанию при указании --delete теперь имеет значение --delete-while, когда оба конца соединения имеют как минимум 3.0.0 (используйте --del или --delete-while, чтобы запросить этот улучшенный режим удаления. явно). Смотрите также параметр --delete-delay, который лучше, чем использование --delete-after.

Инкрементную рекурсию можно отключить с помощью параметра --no-inc-recursive или его более короткого псевдонима --no-ir .

См. Также https://rsync.samba.org для конкретных различий в версиях (прокрутите вниз и просмотрите ссылки на Release News).


3
Спасибо за это, другие ответы приводят к возрасту%, который продолжает расти и падать!
artfulrobot

28

Для длинных передач я доволен бегом du -sс обеих сторон. Даже watch -n1 du -sесли я действительно беспокоюсь.

watchвыполняет команду ( du -sздесь) периодически (каждую секунду здесь) и показывает вывод в полноэкранном режиме.


4
Спасибо за пример watchкоманды!
Cam

2
// , Умная! Согласно linfo.org: «Команда du (т. Е. Использование диска) сообщает о размерах деревьев каталогов, включая все их содержимое и размеры отдельных файлов. Это делает его полезным для отслеживания пространства, занимаемого свиньями, т. Е. Каталогов и файлов. которые занимают большое или чрезмерное количество места на жестком диске (HDD) или другом носителе. "
Натан Басанезе

10
Я не знаю, какие длинные переводы вы делаете, где du жизнеспособен. du будет чертовски медленным, когда результат будет в ТБ и М файлов.
Никто

2
Для моих «длинных передач» операция du занимает около часа, в течение которой rsync работает намного медленнее, потому что они борются за доступ к диску.
Абхи Беккерт

12

В основном нет. Вы можете отображать прогресс для каждого файла с флагом --progress, но это все.

Я предполагаю, что вы можете написать обертку вокруг него или использовать какие-либо патчи, которые вы уже нашли, но вы должны спросить себя, действительно ли это того стоит, вам действительно нужен общий прогресс для rsync?


Вот скрипт-обертка, который показывает общий прогресс и прогресс файла в виде приятного индикатора выполнения: gist.github.com/JohannesBuchner/4d61eb5a42aeaad6ce90
j13r

1
Вы можете изменить способ --progressработы с помощью --info=progress2, он покажет вам глобальный прогресс. Вам нужно будет отключить инкрементальный рекурсивный алгоритм для того , чтобы быть полезным, так--info=progress2 --no-inc-recursive
мат

@ j13r, ты можешь поделиться этой идеей в качестве ответа! отличный вариант!
Skywinder

8

Я использовал ответ из zerodeux и написал свой собственный маленький скрипт на bash:

#!/bin/bash

RSYNC="ionice -c3 rsync"
# don't use --progress
RSYNC_ARGS="-vrltD --delete --stats --human-readable"
SOURCES="/dir1 /dir2 /file3"
TARGET="storage::storage"

echo "Executing dry-run to see how many files must be transferred..."
TODO=$(${RSYNC} --dry-run ${RSYNC_ARGS} ${SOURCES} ${TARGET}|grep "^Number of files transferred"|awk '{print $5}')

${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"

7

Я также искал, как показать общий прогресс с rsync, и я нашел полезный ответ из этого поста: https://stackoverflow.com/questions/7157973/monitoring-rsync-progress

По сути, вы можете использовать --info = progress2 в dev-версии rsync 3.1.0 . Вот что сказал доктор :

Существует также опция --info = progress2, которая выводит статистику на основе всей передачи, а не отдельных файлов. Используйте этот флаг без вывода имени файла (например, избегайте -v или укажите --info = name0, если вы хотите увидеть, как происходит передача без прокрутки экрана с большим количеством имен. (Вам не нужно указывать - опция прогресса для использования --info = progress2.)


1
--info=name0это золото 🌈👑
ipatch

6

Я использовал ответ из zerodeux и написал свой собственный маленький BASH-скрипт:

#!/bin/bash

RSYNC="ionice -c3 rsync"
# don't use --progress
RSYNC_ARGS="-vrltD --delete --stats --human-readable"
SOURCES="/dir1 /dir2 /file3"
TARGET="storage::storage"

#echo "Executing dry-run to see how many files must be transferred..."
TODO=$(find ${SOURCES} | wc -l)

${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"

Я изменил TODO всухую в

TODO=$(find ${SOURCES} | wc -l)

Он находит количество файлов очень быстро!


найти работы , так намного лучше , чем Rsync --dry перспективе!
hopeseekr

4
findработает, только если вы работаете rsyncлокально. rsync --dry-runработает и с удаленными источниками ...
voretaq7

6

Если у вас нет последней версии rsync (например, OS X имеет версию 2.6.9) и вы не можете ее использовать --info=progress2, вот еще одна альтернатива, чтобы уберечь себя от страниц прокрутки текста о ходе работы:

rsync -aPh <source> <destination> | xargs -L1 printf "\33[2K\rTransferring: %s"

В одной строке будет напечатано имя последнего передаваемого файла:

Transferring: the-latest.file


4

использование

lsof -ad3-999 -c rsync

Чтобы увидеть, какие файлы rsync в данный момент открыт (покажет размер файла), rsync копирует в скрытый файл локально


Я хотел опубликовать это, for i in $(pgrep 'rsync'); do ls -l /proc/$i/fd; doneно ваше решение проще.
Аалекс Габи

4

Я бы сделал это комментарий, но мне не хватило репутации. В ответ на комментарий naught101 к выбранному ответу опция --progress показывает, сколько файлов было передано из общей суммы для передачи. Я не осознавал этого, пока не посмотрел этот пост и не посмотрел на результат более внимательно.

Статистика 'to-check' показывает, сколько файлов осталось из общего количества. Это наиболее полезно при rsync'инге в новое место назначения, поэтому вы знаете, что все файлы будут полностью скопированы.

Со страницы руководства:

When [each] file transfer  finishes,  rsync  replaces  the
progress line with a summary line that looks like this:

    1238099 100%  146.38kB/s    0:00:08  (xfer#5, to-check=169/396)

In this example, the file was  1238099  bytes  long  in
total,  the average rate of transfer for the whole file
was 146.38 kilobytes per second over the 8 seconds that
it took to complete, it was the 5th transfer of a regu-
lar file during the current rsync  session,  and  there
are 169 more files for the receiver to check (to see if
they are up-to-date or not) remaining out  of  the  396
total files in the file-list.

3

Обратите внимание на оговорку, что даже --info = progress2 не совсем надежен, так как этот процент основан на количестве файлов, о которых rsync «знает» о том, когда отображается прогресс. Это не обязательно общее количество файлов, которые необходимо синхронизировать (например, если он обнаруживает большое количество больших файлов в глубоко вложенном каталоге). Один из способов убедиться, что --info = progress2 не «отскочил назад» в индикаторе хода выполнения, - заставить rsync рекурсивно сканировать все каталоги перед началом синхронизации (вместо того, чтобы по умолчанию выполнять инкрементно рекурсивное сканирование), также предоставив опцию --no-inc-recursive. Однако обратите внимание, что эта опция также увеличит использование памяти rsync и время выполнения.


Инкрементная рекурсия может быть отключена с помощью --no-inc-recursiveпараметра или его более короткого --no-i-rпсевдонима. (См. Другой ответ)
Коппор

2

Я использую сценарий, который извлекает информацию из / proc // io для процесса rsync (или любого другого процесса в этом отношении), и зная общую сумму, подлежащую передаче, вычисляет прогресс.

#!/bin/bash

usage()
{
   echo "usage: $0 PID BASEMSIZE [DELAY[s|m|h]]"
}

if [ $# -lt 2 ]; then
   usage
   exit 1
elif [ $# -eq 3 ]; then
   DELAY=$3
else
   DELAY=5s
fi

PID=$1
PBASE=`echo "scale=2; $2/1024"|bc`

R_PID=$PID
W_PID=$PID

R_SPEED_MAX=0
W_SPEED_MAX=0
R_SPEED_CUM=0
W_SPEED_CUM=0
R_SPEED_AVG=0
W_SPEED_AVG=0

ETA=0
ETA_H=0
ETA_M=0
ETA_S=0

while [ ! -r /proc/$PID/io ];
do
   clear
   echo "Waiting for process with PID=$PID to appear!"
   sleep 1
done

B_READ_PREV=`cat /proc/$R_PID/io|awk '$1 ~ /^read_bytes/ {print $2}'`
B_WRITE_PREV=`cat /proc/$W_PID/io|awk '$1 ~ /^write_bytes/ {print $2}'`
T1=`date +%s.%N`

count=0
while true
do
   [ ! -r /proc/$PID/io ] && break
   clear
   B_READ=`cat /proc/$R_PID/io|awk '$1 ~ /^read_bytes/ {print $2}'`
   B_WRITE=`cat /proc/$W_PID/io|awk '$1 ~ /^write_bytes/ {print $2}'`
   BL_READ=`echo "scale=2; ($B_READ-$B_READ_PREV)/1048576"|bc`
   BL_WRITE=`echo "scale=2; ($B_WRITE-$B_WRITE_PREV)/1048576"|bc`
   GB_DONE=`echo "scale=2; $B_WRITE/1073741824"|bc`
   PDONE=`echo "scale=2; $GB_DONE*100/$PBASE"|bc`
   T2=`date +%s.%N`
   TLOOP=`echo "scale=2; ($T2-$T1)/1"|bc`
   R_SPEED=`echo "scale=2; $BL_READ/$TLOOP"|bc`
   W_SPEED=`echo "scale=2; $BL_WRITE/$TLOOP"|bc`

   if [ $count -ge 1 ]; then
      R_SPEED_CUM=`echo "scale=2; $R_SPEED_CUM+$R_SPEED"|bc`
      R_SPEED_AVG=`echo "scale=2; $R_SPEED_CUM/$count"|bc`
      W_SPEED_CUM=`echo "scale=2; $W_SPEED_CUM+$W_SPEED"|bc`
      W_SPEED_AVG=`echo "scale=2; $W_SPEED_CUM/$count"|bc`
      [ `echo "scale=2; $W_SPEED > $W_SPEED_MAX"|bc` -eq 1 ] && W_SPEED_MAX=$W_SPEED
      [ `echo "scale=2; $R_SPEED > $R_SPEED_MAX"|bc` -eq 1 ] && R_SPEED_MAX=$R_SPEED
   fi

   if [ `echo "scale=2; $W_SPEED_AVG > 0"|bc` -eq 1 ]; then
      ETA=`echo "scale=2; (($PBASE-$GB_DONE)*1024)/$W_SPEED_AVG"|bc`
      ETA_H=`echo "scale=0; $ETA/3600"|bc`
      ETA_M=`echo "scale=0; ($ETA%3600)/60"|bc`
      ETA_S=`echo "scale=0; ($ETA%3600)%60"|bc`
   fi

   echo "Monitoring PID: $PID"
   echo
   echo "Read:       $BL_READ MiB in $TLOOP s"
   echo "Write:      $BL_WRITE MiB in $TLOOP s"
   echo
   echo "Read Rate:  $R_SPEED MiB/s ( Avg: $R_SPEED_AVG, Max: $R_SPEED_MAX )"
   echo "Write Rate: $W_SPEED MiB/s ( Avg: $W_SPEED_AVG, Max: $W_SPEED_MAX )"
   echo
   echo "Done: $GB_DONE GiB / $PBASE GiB ($PDONE %)"
   [ `echo "scale=2; $ETA > 0"|bc` -eq 1 ] && printf "ETA: %02d:%02d:%05.2f (%.2fs)\n" $ETA_H $ETA_M $ETA_S $ETA
   echo "Elapsed: `ps -p $PID -o etime=`"

   T1=`date +%s.%N`
   sleep $DELAY
   B_READ_PREV=$B_READ
   B_WRITE_PREV=$B_WRITE
   ((count++))
done
echo "----- Finished -------------------------------------------------------------------"

2

Если ваша версия rsyncне принимает --info=progress2опцию, вы можете использовать tqdm:

Установить:

pip install tqdm

Использовать:

$ rsync -av / source / dest | tqdm --unit_scale | туалет
10,0 Мит [00:02, 3,58 Мит / с]

1

Возможно, вы можете комбинировать pvс rsync. Особенно параметр --sizeможет быть полезным. Посмотрите на документы, что-то вроде pv --size $(du -sb . | awk '{print $1}') | rsync -av . host:/your/pathдолжно работать.

Здесь вы найдете документы и программное обеспечение.

Сам не пробовал.


1

Здесь может быть немного поздно, но будущие ищущие ответа могут выиграть.

Это тоже беспокоило меня, поэтому я подумал, что я опустошусь и напишу свой первый сценарий. Пакет zenity должен быть установлен (sudo apt-get install zenity), но я уверен, что он, вероятно, уже будет там. Кроме того, я использую wmctrl (управление оконным менеджером), чтобы изменить заголовок диалогового окна прогресса, когда оно будет сделано, его легко установить, но если вы этого не сделаете, это не будет иметь никакого значения. Мне просто нравится видеть, когда это будет сделано в моей панели.

Сценарий в основном запрашивает каталог источника и назначения, вычисляет процентное соотношение места назначения и размера источника с использованием du и отображает индикатор выполнения.

Примечание: это работает только для полной синхронизации каталогов / файлов (я обычно использую его для создания резервных копий apt-кэша), поэтому --exclude = / file / in / Source-directory опция отсутствует. Также не будет работать, если есть файлы / каталоги в каталоге назначения, а не в исходном каталоге. Я не уверен, работает ли он для удаленных источников / мест назначения, поскольку у меня никогда не было необходимости в нем или в ресурсах для его проверки.

PS. Этот сценарий может быть очень плохо написан или очень неэффективен (скрипт-девственница здесь), но, по крайней мере, он служит своей цели и, конечно, вы можете редактировать и улучшать его в соответствии с вашими потребностями. PSS. Кроме того, не удалось получить кнопку отмены, чтобы убить rsync, поэтому я просто удалил ее.

    #!/bin/bash
set -e;

WELC="Running RsyncP as $USER";

function echo_progress()
{
    while (($TRANSFER_SIZE > 1000));    
    do  
        DEST_SIZE=$(du -s $DEST_FOLDER | cut -d / -f 1); 
        ((TRANSFER_SIZE=$SOURCE_SIZE-DEST_SIZE)); 
        PROGRESS_PERC=$((DEST_SIZE*100/SOURCE_SIZE));
        echo $PROGRESS_PERC;
        sleep 0.1s;
    done;
    echo 100;
    zenity --info --width=250 --title=RsyncP --text="File syncing complete!";
}

function get_input()
{
    dirs=$(zenity --forms --width=500 --title="RsyncP" --text="Enter source And destination directories" --add-entry="Source: " --add-entry="Destination: " --separator=" ");

    SOURCE_FOLDER=$(echo $dirs | cut -d' ' -f 1);
    DEST_FOLDER=$(echo $dirs | cut -d' ' -f 2);

    OPTIONS=-$(zenity --list --title="RsyncP Options" --text="Select rsync options" --separator='' --height=470 --width=470 --checklist --column "activate" --column "Option" --column "Description" FALSE v "Verbose (Terminal only)" FALSE q "Quiet, supress non-error messages (Terminal only)" FALSE P "Progress (Terminal only)" FALSE a "Archive (lrpog)" TRUE r "Recurse into directories" FALSE p "Preserve permissions" FALSE o "Preserve owner" FALSE g "Preserve group" FALSE l "Copy symlinks as symlinks");

    zenity --question --no-wrap --title="RsyncP" --width=500 --text="rsync  $OPTIONS $SOURCE_FOLDER $DEST_FOLDER\nDo you want to continue?";

    SOURCE_SIZE=$(du -s $SOURCE_FOLDER | cut -d / -f 1); 
    DEST_SIZE=$(du -s $DEST_FOLDER | cut -d / -f 1); 
    PROGRESS_PERC=$((DEST_SIZE*100/SOURCE_SIZE)); 
    TRANSFER_SIZE=1001;
}

if [ "$(id -u)" != "0" ]; then
    zenity --question --title=RsyncP --text="$WELC, Continue?";
    get_input;
    rsync  $OPTIONS $SOURCE_FOLDER $DEST_FOLDER & 
    echo_progress | zenity --progress --title=RsyncP --no-cancel --auto-close --text="Copying from \n$SOURCE_FOLDER to \n$DEST_FOLDER" ;

else            
    zenity --question --title=RsyncP --text="$WELC, Continue?";
    get_input; 
    sudo rsync  $OPTIONS $SOURCE_FOLDER $DEST_FOLDER & 
    echo_progress | zenity --progress --title=RsyncP --no-cancel --auto-close --text="Copying from \n$SOURCE_FOLDER to \n$DEST_FOLDER" ;
fi

Посмотрите на ЯД. Это форк (переписать?) Zenity и похож на Zenity ... но на стероидах. Мои сценарии используют его для всего, что связано с Zenity, так как у меня есть машина с только Zenity. Опции команд для этого достаточно похожи, но вы просто потеряете много тонкостей с Zenity.
DocSalvager
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.