
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 rm
Sie nie gesagt haben, dass Sie sich darum überhaupt rsync
kümmern müssen . Von [Hervorhebung von mir]:src/.test1
man 1 rsync
--delete
Dies weist darauf hinrsync
, 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,rsync
das gesamte Verzeichnis zu senden (z. B.dir
oderdir/
), ohne ein Platzhalterzeichen für den Inhalt des Verzeichnisses zu verwenden (z. B.dir/*
).da der Platzhalter von der Shell erweitert wird undrsync
dadurch 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-errors
das Problem gelöst.
Weitere Details: Verwenden von Cygwin zum Kopieren von einem Linux-Server auf ein Windows-USB-Laufwerk.
Quelle ist server:/src
und 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