rsync에서 총 진행률 표시 : 가능합니까?


229

이 옵션을 이미 검색했지만 사용자 지정 패치 와 관련된 솔루션 만 찾았습니다 . 그것이 --help에 표시되지 않고 더 이상 정보를 찾을 수 없다는 사실은 아마도 대답이 '아니오'라고 표시하지만 이것이 확인되고 싶습니다.

rsync 로 전체 파일 전송 진행률 을 표시 할 수 있습니까?


22
rsync 3.1.0부터 기본 총 파일 전송 진행률이 포함되었습니다. 자세한 내용은 answer. serverfault.com/a/441724/107793 을 참조하십시오.
Florian Feldhaus

14
허용 된 답변을 변경하십시오. @David의 답변은 완전히 쓸모가 없습니다.
Navin

답변:


36

다나 김이 맞습니다. 총 진행률 표시기를 추가하는 간단한 방법은 없습니다.

그 이유는 rsync가 동기화 할 파일 목록을 볼 때 어떤 파일을 변경해야하는지 미리 알 수 없기 때문입니다. 델타 전송을 수행하는 경우 수행해야 할 작업에 대한 전체 그림을 제공하기 위해 델타 자체를 미리 계산해야합니다.

다시 말해, 얼마나 많은 작업을 수행해야하는지 계산하는 가장 쉬운 방법은 실제로 수행하는 것입니다.


42
(전송 된 데이터 + 건너 뛴 데이터) / (소스의 총 데이터) 또는 (# 전송 또는 건너 뛴 파일) / (# 소스의 파일)과 같은 간단한 표시기가 여전히있을 수 있습니다. 특히 정확하지는 않지만 아이디어를 줄 것입니다. 하루가 끝날 때 큰 환승을 할 때 유용하며 컴퓨터를 기다렸다가 끄거나 밤새도록할지 궁금합니다.
naught101

3
나는 결론이 옳다고 믿지 않습니다. 나는 @ naught101이 그 질문에 대해 더 공정하다고 생각하고, 사용하지 않는 것에 대한 대답을 제시하는 --size-only것이 더 부정확하다고 생각합니다.
Evan Carroll

2
답장을 쓸 당시에는 정확했습니다 .rsync에는 총 진행률 표시기에 대한 메커니즘이 없었습니다. 그렇습니다, 당신은 당신 자신의 것을 쓸 수 있지만, 소수의 사람들 만이 할 것입니다.
David Mackintosh 2016 년

6
신규 이민자에 대한 의견 : 이제 가능합니다 : serverfault.com/a/441724/422003
imposeren

첫 번째는 "--dry-run"(총 예상 파일 수)을 사용하고 두 번째 패스를 사용하여 세부 출력을 파일에 기록하고 (카운트 라인을 완료하거나 파이프를 'pv'로 사용) 완료하면 쉽게 완료를 추정 할 수 있습니다. 단점은 큰 중첩 디렉토리를 두 ​​번 스캔하는 것입니다. 필요에 따라, 즉 안전한 고객 데이터 마이그레이션 보장에 따라 허용 될 수 있습니다.
ives

377

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
homebrew와 함께 OSX에서 이것을 사용하려면, "brew tap homebrew / dupes; brew install rsync"
Matt Carrier

18
--info=progress2작동하지 않는 점-v
sanmai

42
또한 --no-i-r스위치를 추가하면 rsync복사하기 전에 점진적으로 스캔하지 않고 완전히 스캔하지 않고 남은 작업량을 알고 + 표시합니다.
Alex

16
--human-readable(또는 -h)를 사용 하여 전체 크기 (MB / GB)를 볼 수 있습니다 . 진행 중입니다.
Nux

45

'pv'( apt-get install pv데비안 및 우분투 사용)를 사용할 수 있습니다. 전송되는 데이터의 양은 파일 크기와 관련이 없지만 소스와 대상 사이의 델타에 있으므로 전송 된 파일 수를 모니터링하는 것이 좋습니다. 그리고 파일 수를 세는 것은 하나의 큰 델타와 다른 하나는 작은 델타에 대해 동일한 진행을 계산합니다. 어떤 경우에도 ETA 추정이 멀리 떨어져있을 수 있습니다. 크기 기반 ETA는 목적지가 비어있는 경우에만 작동합니다 (이 경우 delta == size of source).

일반적인 아이디어는 rsync에서 'transfered'파일 당 한 줄을 내보내고 'pv'로 해당 줄을 계산하는 것입니다.

rsync -ai / source remote : / dest | pv -les [파일 수]> / dev / null

나는,이 경우에 당신이 훨씬 저렴 사용할 수 있습니다 (여러 가지 이유로) 백업 전체 파일 시스템에 경향 df(보다는 파일의 수를 얻기 위해 du또는 findrsync를 그것을 한 후 느릅 나무는 소스 계층에게 다른 시간을 통과합니다). -x 옵션은 rsync가 동일한 소스 파일 시스템에 머무르고 다른 내부 마운트를 따르지 않도록하기 위해 나타납니다.

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

일반적인 방법으로 / source에있는 파일을 계산하려면 다음을 사용하십시오 find /source|wc -l(다시 경고 : I / O에서 느리고 무거울 수 있음).


1
zerodeuz가 지정한대로, df -i /source/ source가 상주하는 모든 파티션에서 inode (파일)의 수 를 가져 오므로 전체 파티션을 재 동기화 할 때만 "df"를 사용 하십시오. 그렇지 않으면 'find'를 사용 하여 "$ ()"표현식 내의 디렉토리파일을 계산하십시오 .
lepe

1
에 대한 대안 du이나 find의 당신이 불완전한 사본을 마무리 또는 삭제와의 현재 위치에서 업데이 트를하고있는 가정 해 봅시다는 - - 사용하는 것입니다 rsync -ai --dry-run주요 실행가 전달 될 것 같은 파일 목록 얻기 위해pv
Izkata

32

다음은 rsync 버전 3.0.0 이상에 적용됩니다. 아래 설명 된 옵션은 2008 년 3 월 1 일 해당 릴리스에서 도입되었습니다.

--info = progress2 와 함께 --no-inc-recursive 옵션 (또는 짧은 --no-ir 별칭)을 사용하여 증분 재귀를 비활성화 할 수도 있습니다 .

이것은 전송이 진행됨에 따라 더 많은 파일을 점진적으로 발견하지 않고 처음에 전체 파일 목록을 작성합니다. 시작하기 전에 모든 파일을 알고 있으므로 전체 진행 상황을 더 잘보고 할 수 있습니다. 이는 파일 수에 적용되며 파일 크기를 기준으로 진행 상황을보고하지 않습니다.

여기에는 절충이 포함됩니다. 전체 파일 목록을 미리 작성하는 것은 메모리 비용이 많이 들며 실제 전송 시작을 상당히 지연시킬 수 있습니다. 예상 한대로 파일이 많을수록 지연 시간이 길어지고 필요한 메모리가 늘어납니다.

다음은 rsync 매뉴얼 (source- http : //rsync.samba.org/ftp/rsync/rsync.html)에서 가져온 것입니다 .

-r,-재귀

이것은 rsync에게 디렉토리를 재귀 적으로 복사하도록 지시합니다. --dirs (-d)도 참조하십시오. rsync 3.0.0부터 사용되는 재귀 알고리즘은 이제 이전보다 훨씬 적은 메모리를 사용하고 처음 몇 디렉토리의 스캔이 완료된 후 전송을 시작하는 증분 스캔입니다. 이 증분 스캔은 재귀 알고리즘에만 영향을 미치며 비 재귀 전송은 변경하지 않습니다. 전송의 양쪽 끝이 버전 3.0.0 이상인 경우에만 가능합니다.

일부 옵션은 전체 파일 목록을 알기 위해 rsync가 필요하므로 증분 재귀 모드를 비활성화합니다. --delete-before, --delete-after, --prune-empty-dirs 및 --delay-updates가 포함됩니다. 이 때문에 --delete를 지정할 때의 기본 삭제 모드는 연결의 양쪽 끝이 3.0.0 이상일 때 --delete-during 중입니다 (이 향상된 삭제 모드를 요청하려면 --del 또는 --delete-during 사용) 명시 적으로). --delete-after를 사용하는 것보다 더 나은 --delete-delay 옵션도 참조하십시오.

--no-inc-recursive 옵션 또는 더 짧은 --no-ir 별칭을 사용하여 증분 재귀를 비활성화 할 수 있습니다 .

특정 버전 차이에 대해서는 https://rsync.samba.org참조 하십시오 (스크롤 다운 및 릴리스 뉴스 링크 확인).


3
이것에 대해 감사합니다. 다른 답변은 % age로 계속 올라가고 내려갑니다!
artfulrobot

28

긴 환승을 위해 du -s양쪽 에서 달리는 것이 행복 합니다. 심지어 watch -n1 du -s내가 정말로 불안하다고 느낀다면.

watchdu -s주기적으로 (여기에서 1 초마다) 명령 ( 여기서)을 실행 하고 출력을 전체 화면으로 표시합니다.


4
watch명령 의 예를 주셔서 감사합니다 !
Cam

2
// 영리하다! linfo.org에 따르면 : "du (즉, 디스크 사용량) 명령은 모든 내용을 포함하는 디렉토리 트리의 크기와 개별 파일의 크기를보고합니다. 이로 인해 디렉토리 및 파일과 같은 스페이스 호그를 추적하는 데 유용합니다. "HDD (하드 디스크 드라이브) 또는 기타 저장 매체에서 많은 양의 공간을 소비합니다."
Nathan Basanese

10
du가 가능한 곳에서 어떤 종류의 장기 이체를하는지 모르겠습니다. 결과는 TB 및 M 파일이 될 때 지옥만큼 느립니다.
아무도

2
내 "장거리 전송"의 경우 du 작업을 완료하는 데 약 1 시간이 걸리며,이 시간 동안 rsync는 디스크에 대한 액세스와 싸우고 있기 때문에 훨씬 느리게 실행됩니다.
Abhi Beckert

12

기본적으로 아니요. --progress 플래그를 사용하여 파일 당 진행률 만 표시 할 수 있지만 그 정도입니다.

나는 당신이 그 주위에 포장지를 쓸 수 있거나 이미 찾은 패치를 사용할 수 있다고 생각하지만 실제로 가치가 있는지 스스로에게 물어봐야합니다. 실제로 rsync에 대한 전체 진행이 필요합니까?


다음은 멋진 진행률 표시 줄로
j13r

1
--progress사용하여 작업 방식을 변경할 --info=progress2수 있으며 전 세계 진행 상황이 표시됩니다. 유용하게 사용하려면 증분 재귀 알고리즘을 비활성화해야합니다.--info=progress2 --no-inc-recursive
mat

@ 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

기본적 으로 rsync 3.1.0 의 dev 버전에서 --info = progress2 를 사용할 수 있습니다 . 의사 가 말한 내용은 다음과 같습니다 .

개별 파일이 아닌 전체 전송을 기반으로 통계를 출력하는 --info = progress2 옵션도 있습니다. 파일 이름을 출력하지 않고이 플래그를 사용하십시오 (예 : -v를 피하거나 이름이 많은 화면을 스크롤하지 않고 전송이 수행되는 방식을 보려면 --info = name0을 지정하십시오). --info = progress2를 사용하기위한 progress 옵션.)


1
--info=name0is 🌈👑
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
findrsync로컬로 작동하는 경우에만 작동합니다 . 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귀하의 솔루션은 더 간단합니다.
Aalex Gabi

4

나는 이것을 주석으로 만들지 만 평판이 충분하지 않습니다. 선택한 답변에 대한 naught101의 의견에 대한 응답으로 --progress 옵션은 총 전송량 중 전송 된 파일 수를 표시합니다. 나는이 게시물을보고 출력을보다 신중하게 볼 때까지 이것을 알지 못했습니다.

'확인'통계는 전체에서 남은 파일 수를 나타냅니다. 새 대상으로 재 동기화 할 때 가장 많이 사용되므로 모든 파일이 완전히 복사됩니다.

매뉴얼 페이지에서 :

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별명을 사용하여 증분 재귀를 비활성화 할 수 있습니다 . (다른 답변보기)
koppor

2

나는 rsync 프로세스 (또는 그 문제에 대한 다른 프로세스)를 위해 / proc // io에서 정보를 추출하는 스크립트를 사용하고 전송할 총 금액을 알고 진행률을 계산합니다.

#!/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 | 화장실 -l
10.0Mit [00:02, 3.58Mit / s]

1

아마도 pvrsync와 결합 할 수 있습니다 . 특히 매개 변수 --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 옵션이 없습니다. 소스 디렉토리에없는 대상 디렉토리에 파일 / 디렉토리가있는 경우에도 작동하지 않습니다. 원격 소스 / 목적지에서 작동하는지 또는 테스트 할 리소스가 없었기 때문에 확실하지 않습니다.

추신. 이 스크립트는 매우 잘못 작성되었거나 매우 비효율적 일 수 있지만 (여기서는 스크립트로 작성) 최소한 스크립트의 목적에 부합하며 물론 필요에 맞게 편집하고 개선 할 수 있습니다. 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

YAD를 살펴보십시오. 그것은 Zenity의 포크 (rewrite?)이며 Zenity와 비슷하지만 스테로이드입니다. 내 스크립트에는 Zenity 만있는 머신이 있기 때문에 Zenity로 대체되는 모든 것을 위해 스크립트를 사용합니다. 명령 옵션은 그와 비슷하지만 Zenity로 많은 장점을 잃어 버립니다.
DocSalvager
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.