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.