Die Option „Rsync --delete“ löscht keine versteckten Dotfiles im Ziel

Die Option „Rsync --delete“ löscht keine versteckten Dotfiles im Ziel

Dies sind die Schritte, die ich unternommen habe:

Erstellen Sie einige Testdateien:

/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

Synchronisieren Sie die Verzeichnisse src und 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

Löschen Sie eine Datei in der Quelle und synchronisieren Sie erneut:

/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

Die .test1-Datei wurde im tgt-Verzeichnis nicht gelöscht.

Warum funktioniert die Option --delete in diesem Fall nicht?

Wie bringe ich den rsync-Befehl dazu, versteckte Dateien im Ziel zu löschen?

Antwort1

Das hat nichts mit versteckten Dateien zu tun. Nachdem rmSie nie gesagt haben, dass Sie sich darum überhaupt rsynckümmern müssen . Von [Hervorhebung von mir]:src/.test1man 1 rsync

--delete
Dies weist darauf hin rsync, dass überflüssige Dateien auf der Empfängerseite (die sich nicht auf der Senderseite befinden) gelöscht werden sollen, abernur für die Verzeichnisse, die synchronisiert werden. Sie müssen darum gebeten haben, rsyncdas gesamte Verzeichnis zu senden (z. B. diroder dir/), ohne ein Platzhalterzeichen für den Inhalt des Verzeichnisses zu verwenden (z. B. dir/*).da der Platzhalter von der Shell erweitert wird und rsyncdadurch eine Aufforderung zur Übertragung einzelner Dateien, nicht des übergeordneten Verzeichnisses der Dateien erfolgt. […]

Verzeichnisse synchronisieren, nicht einzelne Dateien:

rsync -avh --delete --progress src/ tgt

Antwort2

Der Trick besteht darin, Verzeichnisse zu synchronisieren (wie von @Kamil Maciorowski erwähnt), aber auch die Einschluss- und Ausschlussfilter zu verwenden, sodass von vornherein nur die Punktdateien synchronisiert werden:

rsync -avh --delete --progress --include '.*' --exclude '*' src/ tgt

Antwort3

In meinem Fall hat das Hinzufügen --ignore-errorsdas Problem gelöst.

Weitere Details: Verwenden von Cygwin zum Kopieren von einem Linux-Server auf ein Windows-USB-Laufwerk.

Quelle ist server:/srcund Ziel ist /cygdrive/e.

Es gab eine versteckte Datei, die von einem vorherigen rsync-Lauf übrig geblieben war. Der Dateiname war ungefähr so.data.qpSS6L

Das Ausführen des folgenden Befehls hatnichtlöschen Sie die Datei:

rsync -rvvth --update server:/src /cygdrive/e --delete

Folgendes fügt --ignore-errors hinzu und löscht die versteckte Datei korrekt:

rsync -rvvth --update server:/src /cygdrive/e --delete --ignore-errors

verwandte Informationen