
這些是我採取的步驟:
建立一些測試文件:
/tmp $ mkdir src tgt
/tmp $ cd src/
/tmp/src $ touch .test{1,2,3}
/tmp/src $ ls -la
total 0
drwxr-xr-x 5 user wheel 170 18 Aug 15:02 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test1
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
同步 src 和 tgt 目錄:
/tmp/src $ cd ..
/tmp $ rsync -avh --delete --progress src/.??* tgt
building file list ...
3 files to consider
.test1
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=2/3)
.test2
0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=1/3)
.test3
0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=0/3)
sent 209 bytes received 86 bytes 590.00 bytes/sec
total size is 0 speedup is 0.00
/tmp $ ls -la tgt/
total 0
drwxr-xr-x 5 user wheel 170 18 Aug 15:03 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test1
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
刪除src中的檔案並再次同步:
/tmp $ rm -rf src/.test1
/tmp $ ls -la src/
total 0
drwxr-xr-x 4 user wheel 136 18 Aug 15:03 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
/tmp $ rsync -avh --delete --progress src/.??* tgt
building file list ...
2 files to consider
sent 75 bytes received 20 bytes 190.00 bytes/sec
total size is 0 speedup is 0.00
/tmp $ ls -la tgt/
total 0
drwxr-xr-x 5 user wheel 170 18 Aug 15:03 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test1
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
tgt 目錄中的 .test1 檔案沒有被刪除。
為什麼 --delete 選項在這種情況下不起作用?
如何使用 rsync 指令刪除目標中的隱藏檔案?
答案1
這與隱藏檔案無關。在rm
你從來沒有說過rsync
要關心之後src/.test1
。來自man 1 rsync
[強調我的]:
--delete
這告訴rsync
我們從接收端刪除無關的檔案(不在發送端的檔案),但是僅適用於正在同步的目錄。您必須要求rsync
傳送整個目錄(例如dir
或dir/
),而不使用目錄內容的通配符(例如dir/*
)因為通配符由 shell 擴展,rsync
因此收到傳輸單一檔案的請求,而不是檔案的父目錄。 […]
同步目錄,而不是單一檔案:
rsync -avh --delete --progress src/ tgt
答案2
訣竅是同步目錄(如 @Kamil Maciorowski 提到的),但也使用包含和排除過濾器,以便首先只同步點檔案:
rsync -avh --delete --progress --include '.*' --exclude '*' src/ tgt
答案3
就我而言,添加--ignore-errors
解決了問題。
更多詳細資訊:使用 cygwin 從 Linux 伺服器複製到 Windows USB 隨身碟。
來源是server:/src
,目的地是/cygdrive/e
。
之前的 rsync 運行留下了一個隱藏檔案。檔案名稱類似.data.qpSS6L
運行以下命令做了不是刪除檔案:
rsync -rvvth --update server:/src /cygdrive/e --delete
以下新增了 --ignore-errors 並正確刪除了隱藏檔案:
rsync -rvvth --update server:/src /cygdrive/e --delete --ignore-errors