Rsync --delete 選項不會刪除目標中隱藏的點文件

Rsync --delete 選項不會刪除目標中隱藏的點文件

這些是我採取的步驟:

建立一些測試文件:

/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傳送整個目錄(例如dirdir/),而不使用目錄內容的通配符(例如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

相關內容