Menampilkan kemajuan total dalam rsync: apakah mungkin?


229

Saya sudah mencari opsi ini, tetapi hanya menemukan solusi yang melibatkan patching kustom . Fakta bahwa itu tidak muncul di --help dan tidak ada info lagi yang dapat ditemukan mungkin menunjukkan jawabannya adalah 'tidak', tetapi saya ingin melihat ini dikonfirmasi.

Apakah mungkin untuk menunjukkan kemajuan total transfer file dengan rsync?


22
Sejak rsync 3.1.0 sekarang ada kemajuan total transfer file dasar yang disertakan. Lihat answer serverfault.com/a/441724/107793 untuk detailnya.
Florian Feldhaus

14
Harap ubah jawaban yang diterima. @ Jawaban David sama sekali tidak berguna.
Navin

Jawaban:


36

danakim benar. Tidak ada cara sepele untuk menambahkan indikator kemajuan total.

Alasannya adalah ketika rsync melihat daftar file yang akan disinkronkan, ia tidak tahu sebelumnya file mana yang perlu diubah. Jika Anda melakukan transfer delta, delta itu sendiri harus dihitung sebelumnya untuk memberikan gambaran total tentang pekerjaan yang perlu dilakukan.

Dengan kata lain, cara termudah untuk menghitung berapa banyak pekerjaan yang harus dilakukan adalah benar-benar melakukannya.


42
Anda masih dapat memiliki indikator sederhana seperti (data yang ditransfer + data yang dilewati) / (total data dalam sumber), atau (# file yang ditransfer atau dilewati) / (# file dalam sumber). Ini tidak akan menjadi sangat akurat, tetapi itu akan memberikan ide. Baik untuk ketika Anda melakukan transfer besar pada akhir hari, dan Anda bertanya-tanya apakah akan menunggu dan mematikan komputer, atau membiarkannya berjalan untuk malam ...
naught101

3
Saya tidak percaya kesimpulan itu benar. Saya pikir @ naught101 lebih adil untuk pertanyaan, dan saya pikir memprediksikan jawaban untuk tidak menggunakan --size-onlyatau sejenisnya lebih lanjut tidak akurat.
Evan Carroll

2
Pada saat saya menulis balasan, itu akurat - rsync tidak memiliki mekanisme untuk indikator kemajuan total. Dan ya, Anda bisa menulis sendiri, tetapi sangat sedikit orang yang mau.
David Mackintosh

6
Komentar untuk pendatang baru: Sekarang mungkin: serverfault.com/a/441724/422003
imposeren

menggunakan dua lintasan, pertama dengan "--dry-run" (jumlah total file yang diharapkan) dan kedua dengan output terperinci yang dicatat ke file (dan menghitung baris lengkap atau menggunakan pipa ke 'pv'), memungkinkan dengan mudah memperkirakan penyelesaian. Kelemahannya adalah memindai direktori bersarang besar dua kali. Bergantung pada kebutuhan, yaitu memastikan migrasi data pelanggan yang aman, ini mungkin dapat diterima.
ives

377

Sekarang ada cara resmi untuk melakukan ini di rsync (protokol versi 3.1.0 versi 31, Diuji dengan 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)

Saya mencoba dengan /usrfolder saya karena saya ingin fitur ini untuk mentransfer seluruh sistem file, dan /usrtampaknya menjadi sampel representatif yang baik.

Ini --info=progress2memberikan persentase keseluruhan yang bagus, bahkan jika itu hanya nilai parsial. Bahkan, /usrfolder saya lebih dari 6 pertunjukan:

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

dan rsyncbutuh banyak waktu untuk memindai semuanya. Jadi hampir sepanjang waktu persentase yang saya lihat adalah sekitar 90% selesai, tetapi tetap menyenangkan untuk melihat bahwa ada sesuatu yang sedang disalin :)

Referensi:


19
Perhatikan bahwa ini telah mendarat di 3.1.0. Penting juga untuk dicatat bahwa ini tidak selalu akurat dalam perspektif waktu. Ini pada dasarnya menunjukkan jumlah data yang telah diverifikasi ada di ujung jarak jauh. Dan tingkat adalah tingkat di mana data sedang dipelajari untuk menjadi benar pada ujung jarak jauh (apakah sudah seperti itu atau data baru ditransfer dan membuatnya benar). Jadi meskipun sangat berguna Anda harus memahami peringatan.
Kevin Cox

15
Untuk menggunakan ini pada OSX dengan homebrew, "brew, ketuk homebrew / dupes; brew install rsync"
Matt Carrier

18
Patut dicatat bahwa --info=progress2tidak bekerja dengan-v
sanmai

42
Tambahkan --no-i-rsaklar juga, jadi rsyncjangan memindai secara bertahap tetapi sepenuhnya sebelum menyalin dan tahu + menampilkan berapa banyak pekerjaan yang tersisa.
Alex

16
Perhatikan bahwa Anda dapat menggunakan --human-readable(atau -h) untuk melihat ukuran total dalam MB / GB .. sedang berlangsung.
Nux

45

Anda bisa dengan 'pv' ( apt-get install pvdengan Debian dan ubuntu). Saya merekomendasikan untuk memantau jumlah file yang ditransfer, karena jumlah data yang ditransfer tidak berkorelasi dengan ukuran file tetapi pada delta antara sumber dan tujuan. Dan menghitung file akan menghitung kemajuan yang sama untuk satu delta besar dan yang lainnya dengan delta kecil. Yang berarti bahwa dalam hal apa pun estimasi ETA mungkin jauh. ETA berbasis ukuran hanya berfungsi jika tujuan Anda kosong, dalam hal ini delta == ukuran sumber.

Gagasan umum adalah memancarkan satu baris per file 'ditransfer' dari rsync, dan hitung baris-baris itu dengan 'pv':

rsync -ai / source remote: / dest | pv -les [jumlah file]> / dev / null

Saya cenderung membackup seluruh filesystem (karena beberapa alasan), dalam hal ini Anda dapat menggunakan yang jauh lebih murah dfuntuk mendapatkan jumlah file (daripada duatau findyang akan melintasi hierarki sumber Anda di lain waktu setelah rsync melakukannya). Opsi -x muncul untuk memastikan rsync tetap pada sistem file sumber yang sama (dan tidak mengikuti mount dalam lainnya):

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

Jika Anda ingin menghitung file dalam / sumber secara umum, gunakan find /source|wc -l(peringatan lagi: mungkin lambat dan berat pada I / O).


1
Seperti ditentukan zerodeuz, gunakan "df" hanya ketika Anda melakukan rsyncing seluruh partisi, karena df -i /sourcemendapat jumlah inode (file) dari semua partisi di mana / sumber berada. Kalau tidak gunakan 'temukan' untuk menghitung file di dalam direktori di dalam ekspresi "$ ()".
lepe

1
Alternatif untuk duatau find- katakanlah Anda sedang menyelesaikan salinan yang tidak lengkap atau melakukan pembaruan di tempat dengan penghapusan - adalah menggunakan rsync -ai --dry-rununtuk mendapatkan daftar file yang sama dengan yang akan dilalui oleh proses utamapv
Izkata

32

Hal berikut ini berlaku untuk rsync versi 3.0.0 dan lebih tinggi. Opsi yang dijelaskan di bawah ini diperkenalkan dalam rilis itu pada 1 Maret 2008.

Bersamaan dengan --info = progress2 Anda juga dapat menggunakan opsi --no-inc-recursive (atau lebih pendek --no-ir ) untuk menonaktifkan rekursi tambahan.

Ini akan membangun seluruh daftar file di awal, daripada secara bertahap menemukan lebih banyak file saat transfer berlangsung. Karena ia akan mengetahui semua file sebelum memulai, itu akan memberikan laporan yang lebih baik dari keseluruhan kemajuan. Ini berlaku untuk jumlah file - tidak melaporkan kemajuan berdasarkan ukuran file.

Ini melibatkan trade-off. Membangun seluruh daftar file sebelumnya lebih banyak memori-mahal dan secara signifikan dapat menunda dimulainya transfer yang sebenarnya. Seperti yang Anda harapkan, semakin banyak file yang ada, semakin lama penundaan akan terjadi dan semakin banyak memori yang dibutuhkan.

Berikut ini dari manual rsync (sumber - http://rsync.samba.org/ftp/rsync/rsync.html ):

-r, --recursive

Ini memberitahu rsync untuk menyalin direktori secara rekursif. Lihat juga --dirs (-d). Dimulai dengan rsync 3.0.0, algoritma rekursif yang digunakan sekarang adalah pemindaian tambahan yang menggunakan memori jauh lebih sedikit daripada sebelumnya dan memulai transfer setelah pemindaian beberapa direktori pertama telah selesai. Pemindaian tambahan ini hanya memengaruhi algoritme rekursi kami, dan tidak mengubah transfer non-rekursif. Ini juga hanya mungkin ketika kedua ujung transfer setidaknya versi 3.0.0.

Beberapa opsi memerlukan rsync untuk mengetahui daftar file lengkap, jadi opsi ini menonaktifkan mode rekursi tambahan. Ini termasuk: --delete-before, --delete-after, --prune-empty-dirs, dan --delay-updates. Karena itu, mode hapus default saat Anda menentukan --delete sekarang --delete-selama ketika kedua ujung koneksi setidaknya 3.0.0 (gunakan --del atau --delete-selama untuk meminta mode penghapusan yang ditingkatkan ini secara eksplisit). Lihat juga opsi --delete-delay yang merupakan pilihan yang lebih baik daripada menggunakan --delete-after.

Rekursi tambahan dapat dinonaktifkan menggunakan opsi --no-inc-recursive atau lebih pendek --no-ir .

Lihat juga https://rsync.samba.org untuk perbedaan versi tertentu (gulir ke bawah dan lihat tautan Berita Rilis).


3
Terima kasih untuk ini, jawaban lain menghasilkan% usia yang terus naik dan turun!
artfulrobot

28

Untuk transfer yang lama, saya senang berlari du -sdi kedua sisi. Bahkan watch -n1 du -s, jika saya merasa sangat cemas.

watchmengeksekusi perintah (di du -ssini) secara berkala (setiap 1 detik di sini) dan menampilkan layar penuh output.


4
Terima kasih untuk contoh watchperintahnya!
Kamera

2
//, Pintar! Menurut linfo.org: "Perintah du (yaitu, penggunaan disk) melaporkan ukuran pohon direktori termasuk semua konten mereka dan ukuran file individu. Ini membuatnya berguna untuk melacak babi ruang, yaitu direktori dan file yang menghabiskan banyak ruang pada drive hard disk (HDD) atau media penyimpanan lainnya. "
Nathan Basanese

10
Saya tidak tahu jenis transfer panjang apa yang Anda lakukan, di mana du layak. du lambat sekali ketika hasilnya akan dalam TB dan M file.
Tidak ada yang

2
Untuk "transfer panjang" saya, du operasi membutuhkan waktu sekitar satu jam untuk menyelesaikan, di mana rsync berjalan lebih lambat, karena mereka memperebutkan akses ke disk.
Abhi Beckert

12

Pada dasarnya tidak. Anda hanya dapat menunjukkan kemajuan per file dengan flag --progress, tetapi hanya itu saja.

Saya kira Anda dapat menulis pembungkus di sekitarnya atau menggunakan salah satu tambalan yang sudah Anda temukan tetapi Anda harus bertanya pada diri sendiri apakah itu benar-benar layak, apakah Anda benar-benar membutuhkan kemajuan total untuk rsync?


Berikut ini adalah skrip wrapper yang menunjukkan kemajuan total dan kemajuan file sebagai bilah kemajuan yang bagus: gist.github.com/JohannesBuchner/4d61eb5a42aeaad6ce90
j13r

1
Anda dapat mengubah cara --progresskerja menggunakan --info=progress2, itu akan menunjukkan kepada Anda kemajuan global. Anda perlu menonaktifkan algoritme rekursif tambahan agar bermanfaat, jadi--info=progress2 --no-inc-recursive
mat

@ j13r Anda dapat membagikan inti ini sebagai jawaban juga! itu pilihan bagus!
Pencakar langit

8

Saya menggunakan jawaban dari zerodeux dan menulis skrip bash kecil saya sendiri:

#!/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

Saya juga mencari cara untuk menunjukkan kemajuan total dengan rsync dan saya telah menemukan penjawab yang berguna dari pos ini: https://stackoverflow.com/questions/7157973/monitoring-rsync-progress

Pada dasarnya, Anda dapat menggunakan --info = progress2 dalam versi dev dari rsync 3.1.0 . Inilah yang dikatakan dokter :

Ada juga opsi --info = progress2 yang menampilkan statistik berdasarkan seluruh transfer, bukan file individual. Gunakan flag ini tanpa mengeluarkan nama file (mis. Hindari -v atau tentukan --info = name0 jika Anda ingin melihat bagaimana transfer dilakukan tanpa menggulir layar dengan banyak nama. (Anda tidak perlu menentukan - opsi progres untuk menggunakan --info = progress2.)


1
--info=name0adalah emas 🌈👑
ipatch

6

Saya menggunakan jawaban dari zerodeux dan menulis skrip BASH kecil saya sendiri:

#!/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"

Saya mengubah TODO dry-run menjadi

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

Ia menemukan jumlah file sangat cepat!


menemukan karya sehingga jauh lebih baik daripada rsync dry-run!
hopeseekr

4
findhanya berfungsi jika Anda menggunakan rsyncsecara lokal. rsync --dry-runbekerja dengan sumber jarak jauh juga ...
voretaq7

6

Jika Anda tidak memiliki rsync terbaru (mis. OS X memiliki 2.6.9) dan tidak dapat digunakan --info=progress2, berikut ini alternatif lain untuk menyelamatkan diri Anda dari halaman-halaman teks yang sedang bergulir:

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

Itu akan mencetak, pada satu baris, nama file terbaru yang ditransfer:

Transferring: the-latest.file


4

Menggunakan

lsof -ad3-999 -c rsync

Untuk melihat file apa yang rsync saat ini telah terbuka (akan menampilkan file) rsync salinan ke file yang tersembunyi secara lokal


Saya ingin memposting ini for i in $(pgrep 'rsync'); do ls -l /proc/$i/fd; donetetapi solusi Anda lebih sederhana.
Aalex Gabi

4

Saya akan membuat komentar ini tetapi tidak memiliki reputasi yang cukup. Menanggapi komentar naught101 untuk jawaban yang dipilih, opsi --progress menunjukkan berapa banyak file yang telah ditransfer dari jumlah total yang ditransfer. Saya tidak menyadarinya sampai melihat posting ini dan melihat output dengan lebih hati-hati.

Stat 'to-check' menunjukkan berapa banyak file yang tersisa dari total. Ini paling banyak digunakan saat rsync'ing ke tujuan baru sehingga Anda tahu semua file akan sepenuhnya disalin.

Dari halaman manual:

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

Perhatikan peringatan di sini bahwa bahkan --info = progress2 tidak sepenuhnya dapat diandalkan karena persentase ini didasarkan pada jumlah file yang diketahui 'rsync' pada saat kemajuan ditampilkan. Ini belum tentu jumlah total file yang perlu disinkronkan (misalnya, jika ia menemukan sejumlah besar file besar di direktori yang sangat bersarang). Salah satu cara untuk memastikan bahwa --info = progress2 tidak 'melompat kembali' dalam indikasi kemajuan adalah dengan memaksa rsync untuk memindai semua direktori secara rekursif sebelum memulai sinkronisasi (alih-alih perilaku standarnya melakukan pemindaian rekursif bertahap), dengan juga menyediakan opsi --no-inc-rekursif. Namun perlu dicatat bahwa opsi ini juga akan meningkatkan penggunaan memori rsync dan run-time.


Rekursi tambahan dapat dinonaktifkan menggunakan --no-inc-recursiveopsi atau --no-i-ralias lebih pendek . (Lihat jawaban lain)
koppor

2

Saya menggunakan skrip yang mengekstrak informasi dari / proc // io untuk proses rsync (atau proses lainnya dalam hal ini) dan mengetahui jumlah total yang akan ditransfer adalah menghitung kemajuan.

#!/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

Jika versi rsyncAnda tidak menerima --info=progress2opsi, Anda dapat menggunakan tqdm:

Untuk memasang:

pip install tqdm

Menggunakan:

$ rsync -av / source / dest | tqdm --unit_scale | wc -l
10.0Mit [00:02, 3.58Mit / s]

1

Mungkin Anda bisa menggabungkan pvdengan rsync. Terutama parameter --sizebisa dengan membantu. Melihat pada dokumen, sesuatu seperti pv --size $(du -sb . | awk '{print $1}') | rsync -av . host:/your/pathharusnya berfungsi.

Di sini Anda akan menemukan dokumen dan perangkat lunak.

Belum mencoba ini sendiri.


1

Mungkin agak terlambat di sini, tetapi para pencari jawaban di masa depan mungkin akan mendapat manfaat.

Ini menggangguku juga, jadi kupikir aku akan turun dan kotor dan menulis skrip pertamaku. Paket zenity harus diinstal (sudo apt-get install zenity), tapi saya yakin itu mungkin sudah ada di sana. Juga, saya menggunakan wmctrl (kontrol manajer jendela) untuk mengubah judul dialog progres ketika selesai, mudah diinstal tetapi tidak akan membuat perbedaan jika Anda tidak. Saya hanya ingin melihat ketika selesai di panel saya.

Script pada dasarnya meminta direktori sumber dan tujuan, menghitung persentase tujuan di atas sumber dalam ukuran menggunakan du dan menampilkan bilah kemajuan.

Catatan: Ini hanya berfungsi untuk sinkronisasi direktori / file lengkap (saya biasanya menggunakannya untuk membuat cadangan apt cache), jadi tidak ada opsi --exclude = / file / in / Source-direktori. Juga tidak akan berfungsi jika ada file / direktori di direktori Tujuan tidak di direktori sumber. Saya tidak yakin apakah itu berfungsi untuk sumber / tujuan yang jauh karena tidak pernah saya membutuhkannya atau sumber daya untuk mengujinya.

PS. Skrip ini mungkin ditulis dengan sangat buruk atau sangat tidak efisien, (skrip-perawan di sini), tetapi setidaknya ini sesuai dengan tujuannya dan tentu saja Anda dapat mengedit dan memperbaikinya sesuai dengan kebutuhan Anda. PSS. Juga, tidak bisa mendapatkan tombol batal untuk membunuh rsync jadi saya baru saja menghapusnya.

    #!/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

Lihatlah YAD. Ini adalah garpu (tulis ulang?) Dari Zenity dan seperti Zenity ... tetapi pada steroid. Skrip saya menggunakannya untuk semuanya dengan fallback ke Zenity karena saya memiliki mesin dengan hanya Zenity di atasnya. Opsi perintah cukup mirip untuk itu tetapi Anda hanya kehilangan banyak keramahan dengan Zenity.
DocSalvager
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.