Die Option Rsync --delete löscht keine Dateien im Zielverzeichnis

14

Ich versuche, die --deleteOption in rsynczu verwenden, um Dateien im Zielverzeichnis zu löschen, die im Originalverzeichnis nicht vorhanden sind

Hier ist der Befehl, den ich benutze:

rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www

Meine Frage ist also, wie kann ich alle Dateien im Zielverzeichnis löschen, die im Originalverzeichnis nicht vorhanden sind?

user2028856
quelle

Antworten:

14

Verwenden Sie diesen Befehl:

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www

Sie brauchen kein "*" und sollten es auch nicht verwenden.

Um Dateien oder Verzeichnisse auszuschließen / einzuschließen, sollten Sie diese Parameter verwenden:

--exclude 'to_exclude*'
--include 'to_include*'
AB
quelle
Okay, lass es mich versuchen :)
user2028856
2
Funktioniert also das "*", das den Befehl --delete verursacht, nicht?
user2028856
2
So siehts aus. :)
AB
3
--recursiveist überreichlich, weil die Option es -abereits enthält
Temak
1
Das "*" kann in einigen Fällen wichtig sein, da es Dateien / Verzeichnisse ausschließt, die mit "." Beginnen. Ich verwende es beispielsweise, wenn ich mit rsync ein unter git verwaltetes Verzeichnis von einer Entwicklungsmaschine auf eine Produktionsmaschine kopiere. Ich möchte nicht das .git-Repository-Verzeichnis oder Dateien wie .gitignore synchronisieren, sondern nur den Arbeitsbaum, einschließlich Dateien auf oberster Ebene sowie Unterverzeichnisse.
Sootsnoot
14

Ihr Befehl hat nicht funktioniert, da /var/www/*Ihre Shell bei der Verwendung als Quelle einen Globbing-Vorgang ausführt, dh, die Shell wird *auf alle Dateien in diesem Verzeichnis erweitert und die Dateien einzeln kopiert. Daher sind hier einzelne Dateien eher die Quellen als das übergeordnete Verzeichnis.

Wenn Sie also verwenden /var/www/*, benötigen Sie keine --recursiveOption, da *die Dateien (zusammen mit allen Verzeichnissen mit ihrem Inhalt) kopiert werden und nicht das übergeordnete Verzeichnis, das die Dateien enthält. Aus dem gleichen Grunde --deletenicht funktioniert, wie --deletewird die Dateien aus Ziel entfernen Verzeichnis , die nicht in der Quelle ist Verzeichnis , aber Sie sind das Kopieren von Dateien so dass sie nicht Entfernen von Dateien (expectedly).

Dadurch werden Sie klarer:

/foo$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test


/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam


$ rsync -avz --ignore-existing --recursive --delete 
/foo/* /bar/

+ rsync -avz --ignore-existing --recursive --delete 
/foo/egg /foo/spam /foo/test /bar/

sending incremental file list
test/
test/hello

sent 173 bytes  received 39 bytes  424.00 bytes/sec
total size is 0  speedup is 0.00


/bar$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test

Wie Sie sehen, habe ich die Quelle verwendet, da der /foo/*auszuführende rsyncBefehl ist

rsync -avz --ignore-existing --recursive --delete /foo/egg 
/foo/spam /foo/test /bar/

Mit *make shell können Sie es erweitern und alle Dateien einzeln als Quellargumente erstellen, nicht das übergeordnete Verzeichnis als Ganzes (und das brauchen Sie --recursivein diesem Fall auch nicht ).

Wenn Sie also arbeiten möchten --delete, führen Sie es wie folgt aus:

rsync -avz --ignore-existing --recursive --delete 
/var/www/ root@mydomaintest.com:/var/www/
heemayl
quelle
4
Hervorragende Erklärung für das eigentliche Problem: Verwenden Sie '*', um die Quellenliste zu erweitern.
Antonio Bardazzi
Wie in meinem Kommentar zur akzeptierten Antwort erwähnt, kann das * nützlich sein, um Dateien und Verzeichnisse auszuschließen, die mit "." Beginnen. Wie Sie bereits bemerkt haben, bedeutet dies, dass Dateien und Verzeichnisse, die auf der obersten Ebene der Quelle entfernt wurden, nicht aus dem Zielverzeichnis entfernt werden. Für mich ist es egal, ob Dateien der obersten Ebene ordnungsgemäß vom Ziel gelöscht werden, nur Dateien unterhalb der Unterverzeichnisse spielen eine Rolle. Das Entfernen eines Unterverzeichnisses der obersten Ebene ist weitaus unwahrscheinlicher als das Hinzufügen eines Unterverzeichnisses, und ich bin bereit, in diesem unwahrscheinlichen Fall ein manuelles rm -r für das Ziel auszuführen.
Sootsnoot