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
? rsync
find는 단일 "-" 및 긴 옵션만 사용한다는 점에서 특이합니다.
rsync에 추가된다는 -prune
것은 각 개별 문자가 단일 옵션 '-p' '-r' '-u' '-n'(이것은 Dry-Run!!) 및 '-e'로 해석됨을 의미합니다.