내 동기화 스크립트에 -prune을 추가하면 rsync가 DRY-RUN으로 전환되는 이유는 무엇입니까?

내 동기화 스크립트에 -prune을 추가하면 rsync가 DRY-RUN으로 전환되는 이유는 무엇입니까?

rsync를 사용하여 두 디렉터리를 양방향으로 지능적으로 동기화하는 스크립트를 테스트하고 있습니다.

테스트 중이므로 다음 줄을 포함하여 많은 rsync 옵션이 테스트 환경에서 작동하지 않습니다.

personal_excludes="
--exclude='home/jesse/scripts/'
--exclude='home/jesse/.*/'"

그래서 제가 -prune그 배제를 끝내야 한다고 생각했을 때 그것이 제 테스트 환경에 어떤 영향도 미칠 것이라고는 전혀 생각하지 못했습니다.

그러나 -prune이 두 줄을 추가하면 rsync가 DRY-RUN을 수행합니다! ! ! ? 무엇? ?

이것이 어떻게/왜인지 알려주고 싶은 사람이 있나요? rsync에 대한 버그 보고서를 제출해야 합니까?

작업 목록

jesse@Limbo ~/dev/sync-script-testing $ ls -la . *
-rwxr-x--- 1 jesse jesse 1910 Dec 29 14:04 test-script.sh

.:
total 24
drwxr-x--- 5 jesse jesse 4096 Dec 29 14:05 .
drwxrwxr-x 7 jesse jesse 4096 Dec 29 13:53 ..
drwxr-x--- 2 jesse jesse 4096 Dec 29 13:43 dir1
drwxr-x--- 2 jesse jesse 4096 Dec 29 13:37 dir2
drwxr-x--- 8 jesse jesse 4096 Dec 29 14:03 .git
-rwxr-x--- 1 jesse jesse 1910 Dec 29 14:04 test-script.sh

dir1:
total 12
drwxr-x--- 2 jesse jesse 4096 Dec 29 13:43 .
drwxr-x--- 5 jesse jesse 4096 Dec 29 14:05 ..
-rw-r----- 1 jesse jesse    0 Dec 29 13:33 file2
-rw-r----- 1 jesse jesse    0 Dec 29 13:34 file3
-rw-r----- 1 jesse jesse    0 Dec 29 13:35 file4
-rw-r----- 1 jesse jesse   32 Dec 29 14:04 .lastsync

dir2:
total 12
drwxr-x--- 2 jesse jesse 4096 Dec 29 13:37 .
drwxr-x--- 5 jesse jesse 4096 Dec 29 14:05 ..
-rw-r----- 1 jesse jesse    0 Dec 29 13:33 file1
-rw-r----- 1 jesse jesse    0 Dec 29 13:34 file3
-rw-r----- 1 jesse jesse    0 Dec 29 13:35 file4
-rw-r----- 1 jesse jesse   32 Dec 29 14:04 .lastsync

스크립트 내용

jesse@Limbo ~/dev/sync-script-testing $ cat test-script.sh 
#!/usr/bin/bash

#rsync -av --files-from=<(cd dir1 && find ./ -newermt "$(sed 's/^Successful sync on //' sync.log)") --exclude=/sync.log ./dir1/ ./dir2/ && echo "Successful sync on $(date -R)" | tee dir2/sync.log > dir1/sync.log
#
#        # Perform the Sync
#        echo -e "\n[1] Uppdate HDD -> USB   DO NOT Include configuration .dot file - They take too long\n"

# First do a sync of ONLY those files modified since last run WITHOUT deleting any files

rsync_general_args="
 --verbose
 --human-readable
 --progress
 --recursive
 --update
 --links
 --perms
 --times
 --group
 --owner
 --devices
 --specials
 --hard-links
 --xattrs
 --one-file-system
 --one-file-system" # specifying --one-file-system twice means something different!

personal_excludes="
 --exclude='home/jesse/scripts/'
 --exclude='home/jesse/.*/'"

# Build list of files to sync
# First use mktemp to create a randomly named temporary directory to keep tempfiles in. This prevents hackers from intercepting data
tmpdir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")

# Find files modified since the last sync, date saved in .lastcync
# Do this in a subshell so as not to change the current directory
$(cd dir1 && find ./ -newermt "$(cat .lastsync)" ! -path "./.lastsync" >$tmpdir/rsync_files_to_sync_from_dir1)
$(cd dir2 && find ./ -newermt "$(cat .lastsync)" ! -path "./.lastsync" >$tmpdir/rsync_files_to_sync_from_dir2)

echo; echo --files-from dir1=$(cat $tmpdir/rsync_files_to_sync_from_dir1)
rsync $rsync_general_args $personal_excludes --files-from=$tmpdir/rsync_files_to_sync_from_dir1 --exclude=/.lastsync ./dir1/ ./dir2/ && date -R > ./dir1/.lastsync

echo; echo --files-from dir2=$(cat $tmpdir/rsync_files_to_sync_from_dir2)
rsync $rsync_general_args $personal_excludes --files-from=$tmpdir/rsync_files_to_sync_from_dir2 --exclude=/.lastsync ./dir2/ ./dir1/ && date -R > ./dir2/.lastsync


# Clean Up
rm -r $tmpdir

스크립트 출력

jesse@Limbo ~/dev/sync-script-testing $ ./test-script.sh 

--files-from dir1=
sending incremental file list

sent 18 bytes  received 12 bytes  60.00 bytes/sec
total size is 0  speedup is 0.00

--files-from dir2=
sending incremental file list

sent 18 bytes  received 12 bytes  60.00 bytes/sec
total size is 0  speedup is 0.00

스크립트 변경: "-prune" 추가

jesse@Limbo ~/dev/sync-script-testing $ git log -p --grep WHY??
commit d9d50bdd289616faaf3d174e6023ba16a5286b53
Author: Jesse the Wind Wanderer <[email protected]>
Date:   Sat Dec 29 14:03:43 2018 +0800

    adding '-prune' causes rsync to do DRY-RUN. WHY???

diff --git a/test-script.sh b/test-script.sh
index 37ee2e6..b45f4a0 100755
--- a/test-script.sh
+++ b/test-script.sh
@@ -26,8 +26,8 @@ rsync_general_args="
  --one-file-system" # specifying --one-file-system twice means something different!

 personal_excludes="
- --exclude='home/jesse/scripts/'
- --exclude='home/jesse/.*/'"
+ --exclude='home/jesse/scripts/' -prune
+ --exclude='home/jesse/.*/' -prune"

 # Build list of files to sync
 # First use mktemp to create a randomly named temporary directory to keep tempfiles in. This prevents hackers from intercepting data

이제 스크립트는 DRY-RUN을 통해 rsync를 실행합니다.

jesse@Limbo ~/dev/sync-script-testing $ ./test-script.sh 

--files-from dir1=
sending incremental file list
./
file2

sent 123 bytes  received 22 bytes  290.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

--files-from dir2=
sending incremental file list
./
file1

sent 127 bytes  received 22 bytes  298.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

답변1

하하, 지금 생각하면 정말 바보같네요. 그래서 나는 이것을 나 자신과 다른 사람들에게 교훈으로 게시하고 있습니다. -prune옵션 인가요 find? rsyncfind는 단일 "-" 및 긴 옵션만 사용한다는 점에서 특이합니다.

rsync에 추가된다는 -prune것은 각 개별 문자가 단일 옵션 '-p' '-r' '-u' '-n'(이것은 Dry-Run!!) 및 '-e'로 해석됨을 의미합니다.

관련 정보